分数与小数互化100道(分数与小数)
【例1】求1/n的值 。
问题描述
给定个非0的整数n ,计算1/n的值 。
输入
第一行整数T ,表示测试组数 。后面T行 ,每行一个整数 n (1≤|n|≤10^5) 。
输出
输出1/n (是循环小数的 ,只输出第一个循环节) 。
输入样例
4
2
3
7
168
输出样例
0.5
0.3
0.142857
0.005952380
(1)编程思路 。
定义数组int vis[100001]; ,其中vis[i]表示整数i作为余数是否出现过 。初始时 ,数组vis的各元素值(除vis[0]外)全部置为0 ,置vis[0]=1 ,因为若余数为0 ,表示除法结束 。
模拟竖式除法过程 ,从num=1开始 ,先置vis[num]=1(表示余数num出现了) ,再输出 num*10/n的整数部分(也是当前位的商),同时修改num为num*10%n 。若vis[num]==1 ,则表示余数num已出现 ,此时要么除尽(num==0),要么构成循环小数 ,结束除法过程;若vis[num]==0 ,则继续上面的竖式除法过程 。
(2)源程序 。
将上面的源程序提交给HDU题库HDU 2522 A simple problem (http://acm.hdu.edu.cn/showproblem.php?pid=2522) ,可以Accepted 。
【例2】分数化小数
问题描述
编写一个程序 ,输入一个形如N/D的分数 ,输出它的小数形式。如果小数有循环节的话 ,把循环节放在一对圆括号中 。
例如 ,1/3=0.33333333… 写成 0.(3) ,4/2=2 写成 2.0 。
输入
输入包含两个整数N和D(1≤N ,D≤105)。
输出
输出按照上面规则计算出的小数表达式 。如果结果长度大于 76 ,每行输出76个字符 。
输入样例
45 56
输出样例
0.803(571428)
(1)编程思路 。
同例1的方法 ,模拟竖式除法过程 。但要注意保存已输出的字符数信息(每输出76个字符要换行) ,还需要寻找出循环节,将其用括号括起来 。
(2)源程序 。
将上面的源程序提交给洛谷题库P1530 [USACO2.4]分数化小数 Fractions to Decimals (https://www.luogu.com.cn/problem/P1530) ,可以Accepted 。
【例3】小数化分数
问题描述
编程序写一个程序,不但可以将普通小数化成最简分数 ,也可以把循环小数化成最简分数 。
输入
第一行是一个整数N ,表示有多少组数据 。
每组数据只有一个纯小数 ,也就是整数部分为0 。小数的位数不超过9位 ,循环部分用()括起来 。
输出
对每一个对应的小数化成最简分数后输出 ,占一行 。
输入样例
3
0.(4)
0.5
0.32(692307)
输出样例
4/9
1/2
17/52
(1)编程思路。
普通纯小数化分数非常方便 ,将小数部分乘以10的m次方 ,使得小数部分全部变成整数 ,之后将这个整数作为分子 ,10的m次方作为分母 ,将分子和分母都除以它们的最大公约数 ,化简为最简分数即可 。
因此 ,本题主要要考虑无限小数如何转换为分数,无限小数分为无限循环小数和无限不循环小数 。而无限不循环小数是不可以化为分数的。题目中给的无限小数都是无限循环小数 。其转化为分数的基本思想是将小数扩大倍数 ,使得扩大后的小数与扩大前的小数部分相同 ,再将两个小数作差即可得出答案 。
例如,将无限循环小数0.32(692307)转化为分数的过程为
0.32(692307) * 100 =32.(692307)
0.32(692307) * 100000000 =32692307.(692307)
上面两个式子相减得 0.32(692307)* 99999900 = 32692275 ,这样循环小数0.32(692307) 转化为分数为32692275/99999900 ,分子与分母再同除以它们的最大公约数1923075 ,化简为最简分数得 17/52 。
(2)源程序 。
将上面的源程序提交给HDU题库HDU 1717 小数化分数2 (http://acm.hdu.edu.cn/showproblem.php?pid=1717) ,可以Accepted 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!