Description
To make this tenable, he assumes that the original fraction is always the simplest one that produces the given sequence of digits; by simplest, he means the the one with smallest denominator. Also, he assumes that he did not neglect to write down important digits; no digit from the repeating portion of the decimal expansion was left unrecorded (even if this repeating portion was all zeroes).
Input
Output
Sample Input
0.2... 0.20... 0.474612399... 0
Sample Output
2/9 1/5 1186531/2500000
Hint
Source
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #define MAX 305 #define inf 0x3f3f3f3f using namespace std; /* 小数转换成分数,分子分母都是整数,所以转化为整数来求 小数部分分为不循环部分和循环部分,由于不清楚哪部分是循环的,然而题目要求分母最小的,所以枚举不循环的部分剩下的是循环部分 然后计算结果 */ int gcd(int a,int b) {///最大公因数 return b ? gcd(b,a % b) : a; } char s[30]; int main() { while(scanf("%s",s) && s[1]) { int mina = 1000000000,minb = 1000000000;///初始化分子分母 更新最小 int dec = 0,c = 0;///dec以整数形式 记录给出的小数部分 c记录位数 for(int i = 2;s[i] != '.';i ++,c ++) {///遍历字串 dec = dec * 10 + s[i] - '0'; } for(int num = dec / 10,j = 10,i = 1;i <= c;i ++,j *= 10,num /= 10) {///num为非循环部分,每次减少一位 i是衡量循环部分的位数 j是循环部分的10的幂 ///下面的计算是根据 假如循环部分是末尾i位 那么 j = 10 ^ i ///非循环部分 是 (dec/j) / 10^(c - i) ///那么循环部分呢,可以用解方程法,举个例子 x = 0.33333... 10x - x = 3.3333... - 0.33333 = 3 ,9x = 3,x =1 / 3 ///再比如0.1212... 10^2x - x = 12,x = 12 / 99 也就是说跟循环节以及其位数有关 假如循环节是N,位数是x,那么化成的分数就是N/(10^x - 1) ///如果是0.001212... 就是在分母多除以一个10^2罢了,这样这道题的循环部分就有了 ///即 循环部分是后i位,前c - i位是非循环部分 那么循环部分表示为 dec % j / ((j - 1) * 10^(c - i)) ///两部分相加通分就是答案 带入 dec % j = dec - dec / j * j 得 (dec - dec / j) / ((j - 1) * 10^(c - i)) int a = dec - num;///dec - dec / j int b = (int)pow(10,c - i) * (j - 1); int k = gcd(a,b); if(b / k < minb) { mina = a / k; minb = b / k; } } printf("%d/%d\n",mina,minb); } }