UVa 202 Repeating Decimals 循环节

来源:互联网 发布:子域名是否需要备案 编辑:程序博客网 时间:2024/06/16 13:25

题目链接: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;}


原创粉丝点击