uva 202(Repeating Decimals UVA - 202)

题目大意

计算循环小数的位数,并且按照格式输出

怎么做

一句话攻略算法核心在于a=a%b*10,用第一个数组记录被除数然后用第二个数组来记录a/b的位数。然后用第三个数组记录每一个被除数出现的位置好去寻找循环节的位置。

我的代码(算法还是借鉴)

#include <iostream>
#include <cstring>
using namespace std;
int ar[300000];
int re[300000];
int lc[300000];
int main()
{
    int a,b;
    while(cin>>a>>b)
    {
        int a1=a;int b1=b;
        int now=1;int ck;
        ck=a/b;
        a=a%b*10;
        memset(re,0,sizeof(re));
        while(re[a]==0)
        {
            re[a]=1;
            lc[a]=now;//这个地方真的非常非常的厉害,第一遍看都没有看懂,实际上这有点预处理记录的感觉
            ar[now]=a/b;
            now++;
            a=a%b*10;
        }
        if(ck<0)
        printf("%d/%d = 0.",a1,b1);
        else
        printf("%d/%d = %d.",a1,b1,ck);
        if(now-lc[a]==0)
        {
            for(int i=1;i<lc[a];i++)
            cout<<ar[i];
            cout<<"(0)\n";
        }
        else
        {
            for(int i=1;i<lc[a];i++)
            cout<<ar[i];
            cout<<"(";
            if(now-lc[a]<50)
            for(int i=lc[a];i<now;i++)
            cout<<ar[i];
            else 
            {
                for(int i=lc[a];i<lc[a]+50;i++)
                cout<<ar[i];
                cout<<"...";
            }
            cout<<")\n";
            cout<<"   "<<now-lc[a]<<" = number of digits in repeating cycle\n\n";
        }
    }
    return 0;   
} 

猜你喜欢

转载自www.cnblogs.com/baccano-acmer/p/9755401.html