UVa 202:Repeating Decimals

题目传送门(Virtual Judge):UVa 202:Repeating Decimals

这道题看起来好像比较复杂,需要在纸上好好举几个例子:

例子1: 1/7 = 0.(142857)

式子余数
1/701
10/713
30/742
20/726
60/784
40/755
50/771
10/713

例子2:655/990 = 0.6(61)

式子余数
655/9900655
6550/9906610
6100/9906160
1600/9901610
6100/9906160

例子3:76/25 = 3.04(0)

式子余数
76/2531
10/25010
100/2540
0/2500
0/2500

例子4:1/6 = 0.1(6)

式子余数
1/601
10/624
40/664
40/664

通过上面的观察,我们可以用两个数组,一个保存商,一个保存余数,每产生一组新的商和余数,我们就检查前面是否出现过。如果出现过,说明遇到循环节了。

代码如下:

#include <iostream>
using namespace std;

int main()
{
    int a, b, res[3003], mod[3003];
    while (cin >> a >> b)
    {
        cout << a << "/" << b << " = " << a / b << ".";
        int i = 0, j, flag = 0;
        while (true)
        {
            res[i] = a / b;
            mod[i] = a % b;
            a = (a % b) * 10;
            for (j = 1; j < i; ++j)
            {
                if (res[i] == res[j] && mod[i] == mod[j])
                {
                    flag = 1;
                    break; // 此时i为循环节第二次出现时的第一个数,i-j为循环长度
                }
            }
            if (flag)
                break;
            ++i;
        }

        for (int k = 1; k < j; ++k) // res[0] 存储的是整数部分
            cout << res[k];
        cout << '(';
        if (i > 50)
        {
            for (int k = j; k <= 50; ++k)
                cout << res[k];
            cout << "...)" << endl;
        }
        else
        {
            for (int k = j; k < i; ++k)
                cout << res[k];
            cout << ')' << endl;
        }
        cout << "   " << i - j << " = number of digits in repeating cycle";
        cout << endl << endl;
    }
    return 0;
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页