一看此题,顿觉茫然,搜得思路,方知原来可以这样。最是累完了,错一点,就得那个望眼欲穿的改哇!
首先须知:小数有 有限和无限之分,其中无限小数中,又分无限循环和无限不循环小数,能用分数表示的当然只有有限小数和无限循环小数。
有限小数就简单了,无论多少只要小数点后面的 除以 10的n次方就行了,约分一下就完事了。
对于无限循环小数分两种,这里举例说明:
⑴ 把0.4747……化成分数。
0.4747……×100=47.4747…… 0.4747……×100-0.4747……=47.4747……-0.4747…… 注:因为是无限小数,所以小数点后趋向于无穷远处的 相减极限为零了 (100-1)×0.4747……=47 //提取公因式0.4747 即99×0.4747…… =47 那么 0.4747……=47/99(2)把0.325656……化成分数,(道理同上)0.325656……×100=32.5656……①
0.325656……×10000=3256.56……② 用②-①即得: 0.325656……×9900=3256.5656……-32.5656…… 0.325656……×9900=3256-32 所以, 0.325656……=3224/9900这里
View Code
1 #include2 #include 3 #include 4 using namespace std; 5 6 7 int gcd(int xiao,int da) 8 { 9 while(xiao%da)10 {11 int tmp=xiao%da;12 xiao=da;13 da=tmp;14 }15 return da;16 }17 18 19 20 int main()21 {22 int T;23 while(cin>>T){24 int i,a,b,cnta,cntb,max;25 int k,l;26 27 char ch[15];28 while(T--)29 {30 cin>>ch;31 bool flag = true;32 a = 0; b = 0; cnta = 0;cntb = 0;33 k = 1; l = 1;34 for(i = 2;ch[i] != '\0'; i++)35 {36 if(ch[i] == '(')37 {38 flag = false;39 b = a;40 cntb = cnta;41 continue;42 }43 if(ch[i] == ')')44 break;45 if(flag)46 {47 a = a*10 + ch[i]-'0';48 cnta++; 49 }50 else51 {52 b = b*10 + ch[i] - '0';53 cntb++;54 }55 56 }57 if(!cntb)58 {59 while(cnta--)60 k *= 10;61 max = gcd(a,k);62 63 cout<