小数化分数2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5723 Accepted Submission(s):
2339
Problem Description
Ray
在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3
0.(4)
0.5
0.32(692307)
Sample Output
4/9
1/2
17/52
Source
Recommend
有限小数很简单,无限小数的化法是利用了无限小数循环的性质,把利用倍数关系去掉无穷部分。
以0.94(375)为例子。
现将他乘100,变为94.(375)。
然后在取他的100000倍,变为94375.(375)
这样两个数小数点后相同,相减后就变为整数了。
以x代表原数;
100000x-100x=94375.(375)-94.(375)=94281
99900x=94281
x=94281/99900
好了这样就做出来了,
剩下的就是基础的字符串操作。
以0.94(375)为例子。
现将他乘100,变为94.(375)。
然后在取他的100000倍,变为94375.(375)
这样两个数小数点后相同,相减后就变为整数了。
以x代表原数;
100000x-100x=94375.(375)-94.(375)=94281
99900x=94281
x=94281/99900
好了这样就做出来了,
剩下的就是基础的字符串操作。
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 int gcd(int a, int b) 8 { 9 return b == 0 ? a : gcd(b, a%b); 10 } 11 int main() 12 { 13 int n; 14 cin >> n; 15 char a[15]; 16 while (n--) 17 { 18 cin >> a; 19 int l = strlen(a); 20 int i; 21 int k = 0; 22 int in = 0;//不循环的有几位 23 bool yk = 0;//是否有循环 24 int ans = 0;//总的部分 25 int dec = 0;//不循环部分 26 for (i = 2; i < l; i++) 27 { 28 if (!yk&&a[i] >= '0'&&a[i] <= '9') 29 { 30 in++; 31 } 32 if (a[i]== '(') 33 { 34 yk = 1; 35 } 36 if (yk&&a[i] >= '0'&&a[i] <= '9') 37 { 38 k++; 39 } 40 } 41 42 for (i = 2; i <= in + 1; i++)//不循环部分先化为整数部分 43 { 44 dec = dec*10 + (a[i] - '0'); 45 } 46 if (!yk)//没有循环的话直接,比如0.5,dec=5,ll=10,答案为1/2 47 { 48 int ll =(int) pow(10, in); 49 int x = gcd(dec, ll); 50 cout << dec / x << "/" << ll/ x << endl; 51 } 52 else 53 {//循环的话,举例0.32(692307) 54 for (i = 2; i < l; i++) 55 { 56 if (a[i] >= '0'&&a[i] <= '9') 57 { 58 ans = ans*10 + (a[i] - '0'); 59 } 60 } 61 l = l - 4; 62 ans = ans - dec;//对于该例子ans=32692307-32 63 int ll = (int)pow(10, l); 64 int lll = (int)pow(10, in); 65 ll = ll - lll;//对于该例子ll=100000000-100 66 int x = gcd(ans, ll); 67 cout << ans / x << "/" << ll/ x << endl; 68 } 69 } 70 return 0; 71 }