cug1173

来源:互联网 发布:网络出版有什么用 编辑:程序博客网 时间:2024/06/01 08:12

题目大意:将一个无限循环小数转化成分母最小的精确分数值....(注意:循环的部分不一定是最后一位,有可能从小数点后面全是循环部分...

路:一个混循环小数的小数部分可以化成分数,这个分数的分子是第二个循环节(含)以前的小数部分组成的数与小数部分中不循环部分组成的数的差。分母的头几位数是9,末几位是09的个数与循环节中的位数相同,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;}


0 0
原创粉丝点击