hdu 1717 --小数化分数2

来源:互联网 发布:icmp端口号是多少 编辑:程序博客网 时间:2024/04/23 19:56

 

 

 

1.有限循环小数化成分数

 

例1:

 

0.5

 

0.5*10=5;

 

0.5 = 5/10 = 1/2;

 

 

例2:

 

0.3275

 

 

0.3275 * 10000 = 3275

 

0.3275 = 3275/10000 = 131/400 ;

 

 

2.无限循环小数化分数

 

例1:

 

0.(4)

 

0.(4) * 10 = 4.(4)        ①

 

0.(4) * 1 = 0.(4)          ②

 

① - ② = 0.(4) * 9 = 4;

 

0.(4) = 4/9 ;

 

 

例2:

 

0.32(692307)

 

0.32(692307) * 10^8 = 32692307.(692307)   ①

 

0.32(692307) * 100 = 32.(692307)                  ②

 

① - ② = 0.32(692307) *(10^8 - 10^2 ) = 32692307 - 32

 

0.32(692307)  = (32692307 - 32) / (10^8 - 10^2 ) ;

 

 

3.无限不循环小数无法化成分数

 

CODE:

 

#include<iostream>using namespace std;int gcd( int a, int b){while(b) { a %= b; a ^= b; b ^=a; a ^=b; }return a;}int base[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};int main(){int t,i;scanf("%d",&t);char str[20];while(t--){scanf("%s",str);int len=strlen(str);len-=2;for(i=0;i<len;i++)str[i]=str[i+2];str[len]=0;int sum=0,k=0,ans,sum2=0;bool judge=true;for(i=0;i<len;i++){if(str[i]=='('){k=i;judge=false;}if(str[i]>='0'&&str[i]<='9'){sum = sum*10+str[i]-'0';if(judge)sum2=sum2*10+str[i]-'0';}}if(!judge){ans =base[len-2]-base[k];sum-=sum2;}elseans=base[len];int r = gcd(sum,ans);printf("%d/%d\n",sum/r,ans/r);}return 0;}


原创粉丝点击