USACO 2.4.5 Fractions to Decimals 题解

【算法】模拟  【难度】★☆☆☆☆


这道题不难,关键是长除法。
手动模拟一下长除法就会发现,小数部分循环的标志是余数的重复出现。
所以记录余数就可以了。注意一下整除的特殊情况就可以了,我因为这个WA了一次。
【收获】要注意特判 

View Code
 1 /*
2 ID: wsc5001
3 LANG: C
4 TASK: fracdec
5 */
6 #include <stdio.h>
7 #include <stdlib.h>
8 int n,d;
9 int checko[100010];
10 int ans[100000];
11 int main()
12 {
13 freopen("fracdec.in","r",stdin);
14 freopen("fracdec.out","w",stdout);
15 int i,j,k,e;
16 int cha,mu;
17 int sve=0,uasdf;
18 int ct=0;
19 scanf("%d%d",&n,&d);
20
21 for (i=0;i<100010;i++) checko[i]=-2;
22
23 e=n/d;k=0;
24 while (e>0)
25 {k++;e=e/10;}
26 if (n/d==0) k=1;
27 printf("%d.",n/d);ct+=k+1;if (ct==76){printf("\n");ct=0;}
28
29 mu=n%d*10;
30 if (mu==0) {printf("0");return 0;}
31 checko[mu/10]=0;
32 i=0;
33 while (1)
34 {
35 if (cha==0) {sve=-999999;break;}
36 ans[i]=mu/d;
37 cha=mu%d;
38 if (checko[cha]==-2)
39 {
40 checko[cha]=i+1;
41 mu=cha*10;
42 i++;
43 }
44 else
45 {i++;sve=checko[cha];break;}
46 }
47 mu=cha*10;
48 ans[i]=mu/d;
49 uasdf=i;
50
51 if (sve==-999999)
52 {
53 for (i=0;i<uasdf;i++)
54 {printf("%d",ans[i]);ct++;if (ct==76){printf("\n");ct=0;}}
55 }
56 else
57 {
58 for (i=0;i<sve;i++)
59 {printf("%d",ans[i]);ct++;if (ct==76){printf("\n");ct=0;}}
60 if (uasdf>sve)
61 {
62 printf("(");ct++;if (ct==76){printf("\n");ct=0;}
63 for (i=sve;i<uasdf;i++)
64 {printf("%d",ans[i]);ct++;if (ct==76){printf("\n");ct=0;}}
65 printf(")");ct++;if (ct==76){printf("\n");ct=0;}
66 }
67 }
68 printf("\n");
69
70 //system("pause");
71 fclose(stdin);
72 fclose(stdout);
73 }



posted @ 2012-03-25 19:34  wsc500  阅读(384)  评论(0编辑  收藏  举报