hdu 1717
题解:
想办法“剪掉”无限循环小数的“大尾巴”。策略就是用扩倍的方法,
把无限循环小数扩大十倍、一百倍或一千倍……使扩大后的无限循环小数与原无限循环小数的“大尾巴”完全相同,
然后这两个数相减,“大尾巴”不就剪掉了吗!我们来看两个例子:
⑴ 把0.4747……和0.33……化成分数。
0.4747……×100=47.4747……
0.4747……×100-0.4747……=47.4747……-0.4747……
(100-1)×0.4747……=47
即99×0.4747…… =47
那么 0.4747……=47/99
⑵把0.4777……和0.325656……化成分数。
0.4777……×10=4.777……①
0.4777……×100=47.77……②
用②-①即得:
0.4777……×90=47-4
所以, 0.4777……=43/90
#include<stdio.h> #include<string> #include<iostream> using namespace std; string s; int gcd(int b,int c) { int d=b%c; if(d==0)return c; else return gcd(c,d); } int main() { int _case; int i; int sum,sumd,gc; scanf("%d",&_case); getchar(); while(_case--) { s.clear(); cin>>s; //cout<<s<<endl; sum=0; sumd=1; for(i=2;i<s.size();i++)//chun xiaoshu { if(s[i]!='(') { sum=sum*10+s[i]-'0'; sumd*=10; } else break; } if(i==s.size()) { if(sum==0) { printf("0\n"); continue; } //printf("%d %d\n",sumd,sum); gc=gcd(sumd,sum); printf("%d/%d\n",sum/gc,sumd/gc); } else { int sumx=sum; int sumy=sumd; for(i=i+1;i<s.size();i++) { if(s[i]!=')') { sum=sum*10+s[i]-'0'; //sumd*=10; sumd*=10; //sumy*=10; } } sum-=sumx; sumd-=sumy; //printf("#%d %d\n",sumd,sum); gc=gcd(sumd,sum); printf("%d/%d\n",sum/gc,sumd/gc); } } return 0; }