cug1173
2015-07-16 22:03
387 查看
题目大意:将一个无限循环小数转化成分母最小的精确分数值....(注意:循环的部分不一定是最后一位,有可能从小数点后面全是循环部分...)
思路:一个混循环小数的小数部分可以化成分数,这个分数的分子是第二个循环节(含)以前的小数部分组成的数与小数部分中不循环部分组成的数的差。分母的头几位数是9,末几位是0。9的个数与循环节中的位数相同,0的个数与不循环部分的位数相同。所以只需要枚举这个数的末端,将其作为循环部分,其余为非循环部分即可计算出分母最小的精确分数值...
思路:一个混循环小数的小数部分可以化成分数,这个分数的分子是第二个循环节(含)以前的小数部分组成的数与小数部分中不循环部分组成的数的差。分母的头几位数是9,末几位是0。9的个数与循环节中的位数相同,0的个数与不循环部分的位数相同。所以只需要枚举这个数的末端,将其作为循环部分,其余为非循环部分即可计算出分母最小的精确分数值...
#include <iostream> #include <string> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; int lcm(int a , int b) { /* { if(!a) return b; return lcm(b%a,a); }*/ int t = a; while(t) { t = b%t; b = a; a = t; } return b; } int main() { char a[100]; while(cin >> a) { int len = strlen(a); if(len == 1) break; int k = 0; int num=0; for(int i = 2 ; i < len ; i ++ , k++ ) { if(a[i] - '.' != 0 ) num = num * 10 + a[i] - '0'; else break; } int up = 1000000000,down = 1000000000; int temp = num; int pos = 1; int a , b ; for(int i = 1 ; i <= k ; i ++ ) { temp /= 10; pos *= 10; a = num - temp; b = (int) pow(10.0 , k - i) * (pos - 1); int res = lcm(a , b); if(b / res < down) { down = b / res; up = a / res; } } cout << up << "/" << down <<endl; } return 0; }