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 }

 

posted @ 2016-01-22 23:41  OhYee  阅读(540)  评论(0编辑  收藏  举报