一看此题,顿觉茫然,搜得思路,方知原来可以这样。最是累完了,错一点,就得那个望眼欲穿的改哇!
首先须知:小数有 有限和无限之分,其中无限小数中,又分无限循环和无限不循环小数,能用分数表示的当然只有有限小数和无限循环小数。
有限小数就简单了,无论多少只要小数点后面的 除以 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 #include<iostream> 2 #include<math.h> 3 #include<string.h> 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 else 51 { 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<<a/max<<'/'<<k/max<<endl; 64 } 65 else 66 { 67 while(cnta--) 68 k *= 10; 69 while(cntb--) 70 l *= 10; 71 max = gcd(b-a,l-k); 72 cout<<(b-a)/max<<'/'<<(l-k)/max<<endl; 73 } 74 } 75 76 } 77 return 0; 78 }