Repeating Decimals UVA - 202

Repeating Decimals UVA - 202

题意大概就是求一个循环节,这道题难的就是在这里了吧。
仔细想一想就能发现,当出现循环节的时候就是被除数与余数都相等的时候,所以我们可以开出一个数组,b[j]记录被除数为j是第几位,然后当再次走到这个位置,由当前的cnt-b[j]就是循环节的长度了。

#include<bits/stdc++.h>
using namespace std;
int a[10005];
int b[10005];
int m,n;
int main(){
    while(scanf("%d %d",&m,&n)!=EOF){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        a[0]=m/n;
        printf("%d/%d = %d.",m,n,a[0]);
        m=m%n;
        int cnt=1;
        while(!b[m] && m){
            b[m]=cnt;
            a[cnt++]=m*10/n;
            m=m*10%n;
        }
        if(m==0){
            for(int i=1;i<cnt;i++)
                printf("%d",a[i]);
            printf("(0)\n");
        }
        else{
            int i;
            for(i=1;i<b[m];i++)
                printf("%d",a[i]);
            printf("(");
            for(;i<cnt && i<=50;i++)
                printf("%d",a[i]);
            if(cnt>50)
                printf("...");
            printf(")\n");
        }
        printf("   %d", m ? cnt-b[m] : 1);
        printf(" = number of digits in repeating cycle\n\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值