UVA - 202 (分数 化 无限循环小数)

UVA - 202  (分数 化 无限循环小数)

UVA - 202 (分数 化 无限循环小数)_第1张图片

UVA - 202 (分数 化 无限循环小数)_第2张图片

 

题意:紫书p59。输入a,b(0<=a<=3000,0<=b<=3000),输出a/b的循环小数以及循环节长度。例如a=5,b=43,小数表示为
5/43 = 0.(116279069767441860465)  ,循环节长度为21.

 

思路:用ans数组模拟相除操作得到小数点后的值,用cnt数组存位置来确定循环节的位置。

UVA - 202 (分数 化 无限循环小数)_第3张图片

 

代码:

#include 

using namespace std;

int ans[100005]; // 存答案
int cnt[100005]; // 存位置

int main()
{
    int a,b;
    while ( cin>>a>>b ) {
        memset(cnt,0,sizeof(cnt));
        memset(ans,0,sizeof(ans));
        printf("%d/%d = %d.",a,b,a/b);
        a = a%b;
        int tot = 1;
        while ( cnt[a]==0 ) { // 用数组模拟小数点后的值
            cnt[a] = tot;
            a = a*10;
            ans[tot++] = a/b;
            a = a%b;
        }

        for ( int i=1; i50 ) {   // 根据题意如果循环串长度大于50,则取50加...
            tot = 51;
        }
        for ( int i=cnt[a]; i50 ) {
            cout << "...";
        }
        cout << ")" << endl;  // 循环串内容输出完成。
        cout << "   " << len << " = " << "number of digits in repeating cycle" << endl; // 循环串的长度
        cout << endl;
    }

    return 0;
}

 

你可能感兴趣的:(紫书习题)