微信扫一扫打赏支持

【USACO 2.4.5】分数化小数

【USACO 2.4.5】分数化小数

一、题目

【USACO 2.4.5】分数化小数

时间限制: 1 Sec  内存限制: 128 MB
提交: 28  解决: 6
[提交][状态][讨论版]

题目描述

写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。例如, 1/3 = .33333333 写成0.(3) 41/333 = 0.123123123... 写成0.(123) 用xxx.0 成表示整数典型的转化例子: 1/3 = 0.(3) 22/5 = 4.4 1/7 = 0.(142857) 2/2 = 1.0 3/8 = 0.375 45/56 = 0.803(571428)

输入

单独的一行包括被空格分开的 N和D, 1 <= N,D <= 100000。

输出

小数的表示方法上面说的很明白了,如果输出的长度超过76个字符,每行输出76个。

样例输入

45 56

样例输出

0.803(571428)

 
二、分析及代码
AC代码
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<string>
 7 using namespace std;
 8 int n,d,a[1000009],h[1000009],tot=0;
 9 bool b[1000009];
10 void write(int a)
11 {
12     printf("%d",a);
13     tot++;if (tot==76) tot=0,printf("\n");
14 }
15 int main()
16 {
17     freopen("src/1in.txt","r",stdin);
18     scanf("%d%d",&n,&d);
19     printf("%d.",n/d);
20     //tot表示数的占位情况
21     int rt=n/d;if (rt==0)tot=1;
22     while (rt) tot++,rt=rt/10;
23     tot++;
24     int j=0,i=0;
25     //取余数
26     n=n%d;
27     //特殊情况判断
28     if (n==0)printf("0");
29     //下面循环就小数
30     while(n)//如果还有余数,也就是还能除的情况,就接着除
31     {
32         i++;
33         if (!b[n])//如果b[n]==0,也就是n这个余数没有出现过的情况
34         {
35             b[n]=true;//将n这个余数置为出现
36             h[n]=i;//表示n这个余数出现的对应位置
37         }else
38         {
39             j=h[n];//余数出现,说明找到了循环节
40             break;
41         }
42         n=n*10;
43         //a[i]里面存储的就是余数
44         a[i]=n/d;
45         n=n%d;//继续找余数
46     }
47     int m=i;//m表示小数部分的个数+1
48     if (j)//如果找到循环节的位置
49     {
50         //输出小数点后的非循环节
51         for (i=1;i<j;i++) write(a[i]);
52         printf("(");tot++;if (tot==76) printf("\n"),tot=0;
53         for (i=j;i<m;i++) write(a[i]);
54         printf(")");tot++;if (tot==76) printf("\n"),tot=0;
55     }else for (int i=1;i<=m;i++)write(a[i]);
56     //每出现循环节,说明是整数
57 
58     return 0;
59 }

 

posted @ 2017-08-18 01:33  范仁义  阅读(1051)  评论(0编辑  收藏  举报