UVA 202 Repeating Decimals

来源:互联网 发布:销量预测模型 python 编辑:程序博客网 时间:2024/05/16 09:43

UVA-202

题意:求m / n 的结果,并求循环结长度。循环结用()包住。
解题思路:整数除整数,那么它整数部分的值我们直接用整数 m/n 就形了,小数部分类似高精除法。
如何判断循环结?因为每次的余数 leave都会先乘 10 再除以 n 作为商,并 得到新的余数。如果一个余数leave出现两次,那么两次之间的串就为循环结。那么我们只要记录余数leave第一次出现的位置,第二次出现就表示开始循环了。注意控制输出。

/*************************************************************************    > File Name: UVA-202.cpp    > Author: Narsh    >     > Created Time: 2016年07月19日 星期二 09时57分00秒 ************************************************************************/#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;int m,n,leave,l,ans[3000000],p[3000000];bool pd[30000000];int main() {    while (scanf("%d%d",&m,&n) != EOF) {        memset(pd,true,sizeof(pd));        printf("%d/%d = %d.",m,n,m/n);        leave=m%n;        l=0;        while (pd[leave]) {            l++;            pd[leave]=false;            p[leave]=l;            leave*=10;            ans[l]=leave/n;            leave %=n;        }        for (int i = 1; i < p[leave]; i++)            printf("%d",ans[i]);        printf("(");        for (int i = p[leave],j = 1; i <=l && j <= 50; i++, j++){            printf("%d",ans[i]);            if (j == 50  &&  i < l) printf("...");        }        printf(")\n");        printf("   %d = number of digits in repeating cycle\n\n",l-p[leave]+1);    }}
0 0
原创粉丝点击