紫书习题3-8 循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)

紫书习题3-8 循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)
输入整数a和b(0≤a≤3000,1≤b≤3000),输 出a/b的循环小数表示以及循环节长度。例如 a=5,b=43,小数表示为0. (116279069767441860465),循环节长度为21。
思路:
关键在于找循环节,用sg来存储每一次的商,用yu数组来存储每一次的余数。在计算小数部分时每次都将上一次的余数乘十作为本次的被除数,依次进行下去直到找到某一次的商和余数在前面出现过,即找到了循环节。

参考博客

#include
using namespace std;
#define maxx 1000
int main()
{
    int a,b;
    cin>>a>>b;
    int sg[maxx],yu[maxx],i=0,j; //sg[]存商,yu[]存余数
    int flag=0;//标记。用来标记已找到循环节,再次跳出外部while循环
    cout<<a/b<<".";
    while(1)
    {
        sg[i]=a/b;
        yu[i]=a%b;
        a=(a%b)*10;
        for(j=1;j<i;j++)
        {
            if(sg[j]==sg[i] && yu[j]==yu[i])//外部声明i,j,用i,j关系来减少使用循环
            {
                flag=1;
                break;
            }
        }
        if(flag) break;
        i++;
    }
    for(int k=1;k<j;k++)
        cout<<sg[k];
    cout<<"(";//用来标记循环节
    for(int k=j;k<i;k++)
        cout<<sg[k];
    cout<<")";
    return 0;
}

你可能感兴趣的:(紫书例题详解,c++)