【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 }
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2024-10-30:27岁,宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308
AI交流资料群:753014672