Repeating Decimals (计算循环小数)

//计算循环小数,并找出循环节以及循环节的长度,最后输出时若循环节大于50最后输出省略号。
//求循环小数,记录被除数,若被除数相同了则证明循环了。
//注意:即使是循环小数,但可能并不是从第一位小数开始循环
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int rm[1010];
int vis[1000010];
int rec[1000010];
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        memset(vis,0,sizeof(vis));
        memset(rec,0,sizeof(rec));
        printf("%d/%d = %d",a,b,a/b);
        a=a%b;
        int k=1;  //k为小数点后循环整数个数 
        while(!vis[a]&&a)
        {
            vis[a]=k;   //记录被除数出现的位置
            rec[k]=a;   //记录被除数
            a=a*10;   //一直保持被除数记录为整数
            rm[k++]=a/b;  //记录小数点后的循环整数
            a=a%b;
        }
        printf(".");
        for(int i=1;i<k&&i<=50;++i)
        {
            if(a&&a==rec[i])
                printf("(");
            printf("%d",rm[i]);
        }
        if(!a)
            printf("(0");
        if(k>50)
            printf("...");
        printf(")
");
        printf("   %d = number of digits in repeating cycle

",a?(k-vis[a]):1);   //注意打印空行
    }
    return 0;
}
原文地址:https://www.cnblogs.com/linxiaojie517/p/7795343.html