Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13640
  • 博文数量: 5
  • 博客积分: 250
  • 博客等级: 二等列兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-16 21:47
文章分类
文章存档

2011年(5)

我的朋友

分类: C/C++

2011-01-19 16:27:09

#include <stdio.h>
#include <string.h>
#include <math.h>

//*************************************

//题目:

// 精确表达浮点数

//

//思路:

// 1.对于有限小数

//     如:X=0.a1a2……an=(a1a2……an)/10^n=(a1a2……an/(gcd(a1a2……an,10^n)))/(10^n/gcd(a1a2……an,10^n));

// 2.对于无限小数

//     如:X=0.a1a2……an(b1b2……bm)=(a1a2……an+0.(b1b2……bm))/10^n

// =(a1a2……an+b1b2……bm/(10^m-1))/10^n

// =(a1a2……an*(10^m-1)+b1b2……bm)/(10^m-1)*10^n

// 说明:

//       (1)0.(b1b2……bm)表示:b1b2……bm无限循环,后面的等式类似。

//       (2)0.(b1b2……bm)=b1b2……bm/(10^m-1)推导如下:

// 令Y=0.(b1b2……bm)

// 则:(10^m)*Y=b1b2……bm+0.(b1b2……bm)

//   (10^m-1)*Y= b1b2……bm

// Y=b1b2……bm/(10^m-1)

//*************************************


int gcd(int m,int n)
{
    int gcd,t;
    int x,y;
    x=m>n?m:n;
    y=m>n?n:m;
    while(y!=0)
    {
        x=x%y;
        t=x;
        x=y;
        y=t;
    }
    gcd=x;
    return gcd;
}
int main()
{
    char a[100];    
    int aLen=0;
    while(scanf("%s",a)==1)
    {
        int dot;                              //小数点的位子
        int Infinite=-1;                     //无限小数左括号位子
        aLen=strlen(a);        
        for(int i=0;i<aLen;i++)
        {
            if(a[i]=='.') dot=i;
            if(a[i]=='(') Infinite=i;
        }

        //
        //有限小数的处理方式
        //
        if(Infinite==-1)
        {            
            char result1[100];
            int count=0;
            for(int i=0;i<aLen;i++)
            {
                if(a[i]!='.')
                {
                    result1[count++]=a[i];                    
                }
            }        
                    
            int fz=0,fm=0,gcd1=1;
            for(int i=count-1;i>=0;i--)
            {                
                fz+=(result1[i]-48)*(pow(10.0,count-1-i));
            }
            fm=pow(10.0,aLen-(dot+1));
            gcd1=gcd(fz,fm);                
            fz=fz/gcd1;
            fm=fm/gcd1;            
            printf("%d/%d\n",fz,fm);
        }

        //
        //无限小数:只是0~1之内的小数
        //X=(a1a2……an*(10^m-1)+b1b2……bm)/(10^m-1)*10^n
        else{            
            int n,m;                                //n:a1~an;m:b1~bm;
            n=Infinite-(dot+1);
            m=aLen-1-(Infinite+1);
            int fz=0,fm=0,gcd2=1;
            for(int i=dot+1;i<Infinite;i++)
            {                
                fz+=(a[i]-48)*(pow(10.0,n-i+dot));
            }            
            fz=fz*(pow(10.0,m)-1);            
            for(int i=Infinite+1;i<aLen-1;i++)
            {                    
                fz+=(a[i]-48)*(pow(10.0,m-i+Infinite));                    
            }        
            fm=(pow(10.0,m)-1)*pow(10.0,n);
            gcd2=gcd(fz,fm);
            fz=fz/gcd2;
            fm=fm/gcd2;            
            printf("%d/%d\n",fz,fm);
        }
    }
    
    return 0;
}


阅读(541) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-08 20:45:33

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com