您的位置:首页 > 其它

POJ 1930 Dead Fraction(循环小数转换成分数)

2016-04-05 21:39 423 查看
http://poj.org/problem?id=1930

这道题就是吧0.XX..的循环小数转化成分数,可能存在多个有可能的循环节,那么就选择输出分母最小的情况。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<string>
#define LL unsigned long long
#define INF ((LL)1<<61)
using namespace std;
LL Min, l, l1, l2, n1, n2, m1, m2, tmp, a, b, c, x, y;
string s, rc, s1, s2;
LL gcd(LL a, LL b)
{
if (b == 0) return a;
else return gcd(b, a % b);
}
int main()a
{

while (cin >> s && s != "0")
{
Min = INF;
l = s.size();
s.erase(l-3, 3);
s.erase(0, 2);
l = s.size();
for (int rcl = 1; rcl <= l; rcl++)
{
rc = s.substr(l-rcl, rcl);
int j = 0;
for (j = l-rcl*2; j >= 0; j -= rcl)
{
if (s.substr(j, rcl) != rc) break;
}
j += rcl;
s1 = s.substr(0, j);
l1 = s1.size();
n1 = 1;
for (int i = 0; i < l1; i++) n1 *= 10;
m1 = 0;
for (int i = 0; i < l1; i++)
{
tmp = s1[i] - '0';
m1 = m1 * 10 + tmp;
}
s2 = rc;
l2 = s2.size();
n2 = 1;
for (int i = 0; i < l2; i++) n2 *= 10;
m2 = 0;
for (int i = 0; i < l2; i++)
{
tmp = s2[i] - '0';
m2 = m2 * 10 + tmp;
}
a = m2+m1*n2-m1;
b = n1*n2-n1;
c = gcd(a, b);
a = a/c;
b = b/c;
if (b < Min)
{
Min = b;
x = a;
y = b;
}
}
printf("%llu/%llu\n", x, y);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: