C-C语言输入一个分数,输出值,并标记循环节
输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。如果小数有循环节的话,把循环节放在一个对括号中,例如:
1/3=0.33333333 写成0.(3)
41/333=0.123123123 写成0.(123)
用xxx.0表示整数
典型的转化例子:
1/3=0.(3)
22/5=4.4
22/5=4.4
2/2=1.0
3/8=0.375
45/56=0.803(571428)
【输入格式】
单独的一行包括被空格分开的N和D,1<=N,D<=100000。
【输出格式】
输出一行小数的表示方法上面已经说得很明白了。
【样例输入】
45 56
【样例输出】
0.803(571428)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
其实你的问题,最麻烦的地方在于怎么判断该数是一个循环小数。
我觉得可以才用
这么一种策略。
X/Y是要求的小数,那么
10^n * (X/Y) - 10^m * (X/Y) = Z, n>m,属于 R
即从n=1开始, 找到合适的n, m使得Z是整数
那么,这个时候 m+1, n分别是循环开始和结束的位置.
当明白了逻辑的时候,代码实现就容易了。
设除数为N, 每次的余数都是 0~ N-1 中的一个,循环节不会大于N,如果新一轮的余数是之前出现过的余数,那么就循环了。
用数组就行,记录余数出现的位置。
简单的说下个人的想法吧
首先处理结果的整数部分,直接N/D得到整数部分,例如45/46=0,输出“0.”
接下来是小数部分,维护一个链表,链表的节点数据是分子模除分母得到的商a和余数b,然后b*10模除分母,保存得到的商和余数,利用余数在链表中查找节点上是否存在该余数值,如果找到那么停止,记下该节点的位置设为q,输出这个链表的节点商的值,当到达q位置的时候输出“(”接着输出知道链表结束时输出“)”。如果刚好整除,那么直接输出
操作的过程:
例如,45 56
45/56=0;输出“0.”
45 * 10 56 商为8,a=8,余数为2,b=2,存入链表中
然后2 * 10 56 商为0,余数为20存入链表中,余数20在链表中查找,没有找到继续。。。
楼主写错了一个数是56不是46.。。。
那若是非循环小数呢我也觉得这其实是个数学问题非编程问题即如何判断一个小数是循环或者非循环