3-8 uva 202 Repeating Decimals

来源:互联网 发布:适合程序员的机械键盘 编辑:程序博客网 时间:2024/06/08 17:57
背景:一开始没有什么头绪,只知道要模拟除法,甚至想用找周期的方法,发现根本不可行。。。。觉得自己数学简直是个渣,,连余数出现第二次则开始进入循环都想不到。。。
(感觉这题要收起来,等快要忘记的时候再拿出来写一写orz)

学习:就是利用模拟除法的方法,然后记录余数,若c这余数出现第二次则进入循环,最后计算循环节长度时要减去之前没有进入循环的位数。

#include<stdio.h>#include<string.h>int u[3003],s[3003],r[3003];int main(){int x,y;while (scanf("%d%d",&x,&y)==2){memset(u,0,sizeof(u));memset(r,0,sizeof(r));printf("%d/%d = ",x,y);int count=0;  //count表示第几位小数 , count=0时则是整数部分 r[count++]=x/y;x=x%y;while (!u[x] && x)    //u[n]==0表示余数还未出现过 {s[count]=x;     //s[]用于记录余数 u[x]=count;   //标记之前小数上已有几位数 r[count++]=10*x/y;x=10*x%y; }printf("%d.",r[0]);int i;for(i=1;i<count&&i<=50;i++){if(s[i]==x)printf("(");printf("%d",r[i]);}if(!x)       //若x==0则表示被整除 printf("(0");if(i==51)printf("...");printf(")\n");printf("   %d = number of digits in repeating cycle\n\n",!x?1:count-u[x]);   //记得用count-u[x] 减掉之前没有循环的部分 }return 0;}


0 0
原创粉丝点击