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

本文介绍了一种将无限循环小数转换为最简分数形式的算法实现,并提供了完整的C++代码示例。该算法考虑了多种可能的循环节情况,并确保输出的分数拥有最小的分母。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值