Uva 202.Repeating Decimals
题目大意就是取循环小数的循环节
思路比较清晰
完全模拟人脑做除法,同时分组标记被除数和除数,判断循环节
中间需要判断是除尽和没除尽两种情况
最后要关注格式,每两个输出要有空行,且第二行前有3个空格
一下代码
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 #define REP(n) for(int o=0;o<n;o++) 6 7 struct node{ 8 int a,b; 9 }; 10 11 bool Do(); 12 int visited(int a,int b,node n[],int len); 13 int main(){ 14 //freopen("in.txt","r",stdin); 15 while(Do()); 16 return 0; 17 } 18 19 bool Do(){ 20 int a,b; 21 node mark[10000]; 22 int cnt=1; 23 int decimal[10000]; 24 25 if(scanf("%d%d",&a,&b)==EOF)return false; 26 REP(10000)mark[o]={0,b}; 27 REP(10000)decimal[o]=-1; 28 29 int x=(a%b)*10; 30 while(1){ 31 //printf(" %d / %d = %d ...... %d mark[%d]={%d,%d}\n",x,b,x/b,x%b,cnt,x,b); 32 decimal[cnt]=x/b; 33 if(visited(x,b,mark,cnt))break; 34 mark[cnt]={x,b}; 35 x=(x%b)*10; 36 cnt++; 37 } 38 cnt--; 39 //REP(cnt+1)printf(" mark[%d]={%d,%d}\n",o,mark[o].a,mark[o].b); 40 int begin=visited((mark[cnt].a%b)*10,mark[cnt].b,mark,cnt); 41 42 //printf("\n\n%d\n\n",begin); 43 printf("%d/%d = %d.",a,b,a/b); 44 for(int i=1;i<=cnt;i++){ 45 if(begin==i)printf("("); 46 printf("%d",decimal[i]); 47 if(i==50){ 48 printf("..."); 49 break; 50 } 51 } 52 if(begin==0)printf("(0"); 53 printf(")\n %d = number of digits in repeating cycle\n\n",begin==0?1:cnt-begin+1); 54 return true; 55 } 56 57 int visited(int a,int b,node n[],int len){ 58 for(int o=1;o<=len;o++){ 59 if(n[o].a==a&&n[o].b==b){ 60 return o; 61 } 62 } 63 return 0; 64 }
然而,我并不能保证我说的是对的。请自行验证,如有错误,请指正
新博客地址
https://www.oyohyee.com
https://www.oyohyee.com