uva 10555 - Dead Fraction)(数论)

来源:互联网 发布:怎么把微店搬到淘宝 编辑:程序博客网 时间:2024/05/29 04:40

题目链接:uva 10555 - Dead Fraction

题目大意:给出一个小数,从...开始可以是任何数字,但是保证是无限循环小数,将该小数用分式的形式表示,并且要求分母尽量大。

解题思路:这题主要是怎么将无限循环小数转换成分式,这样的:

  • 有小数0.abcdEEE,未循环部分长4,循环节为E,E的长度为i(假设)
  • abcd+E999(i910i
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 105;const ll INF = 0x3f3f3f3f3f3f3f;char s[maxn];ll gcd (ll a, ll b) {    return b ? gcd(b, a%b) : a;}int main () {    while (scanf("%s", s) == 1 && strcmp(s, "0")) {        int len = strlen(s)-5;        ll ansu, ansd = INF;        for (int i = 0; i < len; i++)            s[i] = s[i+2];        for (int i = 0; i < len; i++) {            ll d = 1, u = 0;            for (int j = 0; j < i; j++) {                d = d * 10;                u = u * 10 + s[j] - '0';            }            ll x = 0, y = 0;            for (int j = i; j < len; j++) {                x = x * 10 + s[j] - '0';                y = y * 10 + 9;            }            d = d * y;            u = u * y + x;            ll g = gcd(d, u);            u /= g;            d /= g;            if (d < ansd) {                ansd = d;                ansu = u;            }        }        printf("%lld/%lld\n", ansu, ansd);    }    return 0;}
1 0
原创粉丝点击