小数化分数 (思维)
Q - 小数化分数2
Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3
0.(4)
0.5
0.32(692307)
Sample Output
4/9
1/2
17/52
解题思路:
根据题目可知,一共有三种形式的小数需要我们去转换成分数,分别为:
- 有限小数:形如 0.2,0.33
- 纯循环小数:形如 0.333333333…
非纯循环小数:形如 0.32477777… ,0.24367676767…
显然,无限不循环小数不可能转换为分数(中学知识),而对于上面两种循环小数,我们不妨分情况来讨论。
1、纯循环小数
0.33333… * 10 = 3.33333…
(10 - 1) * 0.33333… = 3
即 9 * 0.33333… = 3
所以 0.33333… = 3/9 = 1/3
再举一个例子
0.474747… * 100 = 47.474747…
(100 - 1) * 0.474747… = 47
即 99 * 0.474747… = 47
所以 0.474747… = 47/99由上述两个例子我们可以发现,纯循环小数化成分数过后其分子就为所循环单元化成的数,分母则全由9组成,位数和循环数的位数相同。
2、非纯循环小数
0.4777777… * 10 = 4.7777…
0.477777… * 100 = 47.77777…
(100 - 10) * 0.4777777… = 43
所以 0.4777777… = 43/90
再举一个例子
0.323565656… * 1000 = 323.56565656…
0.323565656… * 100000= 32356.565656…
(10000 - 1000) * 0.32356565656… = 32033
所以 0.32356565656… = 32033/99000由上述两个例子我们可以发现,非纯循环小数化成分数过后其分子为 非循环部分与第一个循环部分 组成的数减去非循环部分的数,分母则为9与0组成的数,9的位数和循环部分数的位数相同,0的位数则和非循环部分数的位数相同
PS:对于有限小数,不妨看作是非纯循环小数的一种特例子,即0.3 = 0.30000000
Code:
#include <cstdio>
#include <math.h>
int gcd(int a,int b){int c;c = a % b;while (c) {a = b;b = c;c = a % b;}return b;
}int main(){int N;scanf("%d",&N);while (N--) {char a[15];scanf("%s",a);int flag1 = 0; //用来判断是否检查到过 '(' 符号int p = 0,q = 0; //p代表非循环的位数,q代表循环的位数int x = 0,y = 0,z = 0; //x代表分子,y代表分母,z代表括号中的数for (int i = 2;a[i];i++){if (a[i] != '(' && flag1 == 0){x *= 10;x += a[i] - '0';p++;}if (a[i] == '(' && flag1 == 0){flag1 = 1;i++;}if (a[i] != ')' && flag1 == 1){z *= 10;z += a[i] - '0';q++;}}if (flag1 && p){int n = q;int m = p;int temp = x;while(n--){y *= 10;y += 9;x *= 10;}while(m--){y *= 10;}x = x + z - temp;}if (flag1 && !p ){int n = q - 1;y = 9;x = z;while (n--) {y *= 10;y += 9;}}if (!flag1){int n = p;y = 1;while(n--)y *= 10;}int c = gcd(x, y);x /= c;y /= c;printf("%d/%d\n",x,y);}return 0;
}
小数化分数 (思维)相关推荐
- 紫书 习题8-14 UVa 1616(二分+小数化分数+精度)
参考了https://www.cnblogs.com/dwtfukgv/p/5645446.html (1)直接二分答案.说实话我没有想到, 一开始以为是贪心, 以某种策略能得到最优解. 但是想了很久 ...
- 分数化成有限小数的方法_分数化小数的方法|小数化分数题目
[www.520z-2.com - 话题作文] 小数由整数部分.小数部分和小数点组成.当测量物体时往往会得到的不是整数的数,古人就发明了小数来补充整数 小数是十进制分数的一种特殊表现形式.下面是小学生 ...
- 小数化分数 思路及代码模板 c++实现
小数化分数 将一个小数化成一个最简分数的模板,小数包含简单小数和循环小数. 对于循环小数的输入我们将循环体用括号括起来表示. 思路 首先我们将小数部分的数化为分数:对于整数部分我们只需要将化好的分子加 ...
- 小数化分数c++(附做法数学证明)
小数化分数 时间限制(普通/Java):1000MS/10000MS 内存限制:65536KByte 描述 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想 ...
- HNU程序设计-小数化分数
一.问题描述 二.问题分析及思路 小数化分数: 1.对于不循环小数,小数点后有i位,则分子为这i位数,分母为10的i次方,约分得到最简分数(除最大公约数) 2.对于只有循环的小数,分子为循环的部分(i ...
- 小数点化分数的过程_小数化分数
分数和小数的互化 _五__年级__数学____备课组教案 教师 课题 备课时间 分数和小数的互化 课时 课型 新授 课前准备:教材剖析(考点.易错点.关联考点) . 1. 理解并掌握分数和小数互化方法 ...
- 小数化分数的口诀表_五年级数学下册分数与小数的互化,常用的小数化成分数表,要熟记...
分数与小数是两类不同的数字,它们之间可以互相转化.分数与小数,这两类数字又有各自不同的特点,在具体的使用环境中,虽然说这两个数字可以互相通用,但是它们的特性不同,所使用的范围是不一样的,有些情况下使用 ...
- c语言小数化分数,小数化分数
小数化分数 /*小数化分数,非循环*/ #include #include #include double zdgys(double c,double d) {double o,p; o=1;p=1; ...
- poj 1930 无限小数化分数
题意: 无限小数化分数. 转自: http://blog.csdn.net/xinghongduo/article/details/6231107 代码: #include <iostream& ...
最新文章
- python接口测试-认识GET请求
- thinkphp 5.0.3 rce getshell_关于ThinkPHP的一些渗透方式
- 图神经网络世界冠军团队手把手授课,7天搞定图神经网络!
- mysql错误代码 集合
- 3d vision可以卸载吗_金属粉末可以用于3D打印,但这些知识你了解吗?
- php selected,php-多个选择字段-多次使用selected =“ selected”
- qt 快速按行读取文件_这是知识点之Linux下分割文件并保留文件头
- windbg命令集合
- DotNetNuke 4/5 安装提示 msajax错误,下载AJAX 1.0即可解决
- 触摸传感器的电路图符号_如何看懂汽车电路常用图形符号,看完这篇文章就懂了...
- mysql读写分离错_MySQL主从同步、读写分离配置步骤、问题解决
- 巴斯勒相机外部触发接线_PLC控制柜的设计原理,电装布局、接线图和原理图
- hb100 微波雷达arduino_HB100微波雷达模块无线X波段雷达探测器探头传感器模块10.525GHz...
- CSS内联样式表、内部样式表、外部样式表
- 零基础SSM入门教程(50)–Spring总结与展望SpringBoot、SpringCloud
- 从苹果封杀Epic与特斯拉硬刚拼多多看新时代的渠道产品战
- 新款「超大杯」iPhone遭爆料!不止大镜头,还有1TB储存,但却不能叫iPhone13
- 彻底搞懂内存屏障(上)
- 一个对中国房地产业忧心忡忡的金融博士生
- 【互动多媒体】应用形式(二)体感换装/虚拟试衣