UVa 202 Repeating Decimals 循环节

题目链接:https://odzkskevi.qnssl.com/249e6049be24dee57a1c3b28ebf8f12d?v=1510665795


这个题题意:输入整数a和b(0≤a≤3000,1≤b≤3000),输出a/b的循环小数表示以及循环节长度。例
如a=5,b=43,小数表示为0.(116279069767441860465),循环节长度为21。


就是求循环节,模拟一下

这里有一个优化,如果后面某一位余数和前面某一位余数相同,那么就构成循环了,仔细想想,就是那么回事哈

如果不理解,建议先别看输出,在纸上画画那个除法的竖式

My ugly code

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>

using namespace std;
const int maxn=3000+30;

int n,m;
int vis[maxn],r[maxn],bb[maxn];
int cas=1;

int main(){

    while(~scanf("%d%d",&n,&m)&&m){
        printf("%d/%d = %d.",n,m,n/m);
        int cnt=0;
        r[cnt++]=n/m;
        n=n%m;//n代表余数
        memset(vis,0,sizeof(vis));
        memset(bb,0,sizeof(bb));
        bb[0]=n;
        while(!vis[n] && n > 0){
            vis[n]=1;
            bb[cnt]=n;
            r[cnt++]=(n*10)/m;
            n=(n*10)%m;
        }

        int jian=0;
        for(int i=1;i<cnt && i<=50;i++){
            if(bb[i] == n){
                printf("(");
                jian=i;
            }
            printf("%d",r[i]);
        }
        if(n==0){
            cnt=1;
            printf("(0");
        }
        if(cnt > 50)
            printf("...");
        printf(")\n");
        printf("   %d = number of digits in repeating cycle\n",cnt-jian);
        printf("\n");
    }

    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值