码迷,mamicode.com
首页 > 其他好文 > 详细

Uva 202.Repeating Decimals

时间:2016-01-23 01:04:09      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

题目大意就是取循环小数的循环节

思路比较清晰

完全模拟人脑做除法,同时分组标记被除数和除数,判断循环节

中间需要判断是除尽和没除尽两种情况

最后要关注格式,每两个输出要有空行,且第二行前有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 }

 

Uva 202.Repeating Decimals

标签:

原文地址:http://www.cnblogs.com/ohyee/p/5152646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!