您的位置:首页 > 其它

cug1173

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

思路:一个混循环小数的小数部分可以化成分数,这个分数的分子是第二个循环节(含)以前的小数部分组成的数与小数部分中不循环部分组成的数的差。分母的头几位数是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: