首页 > 新闻中心 > 技术百科

循环小数化分数的公式,循环小数化分数的方法 返回列表

网络2023-08-27 00:00:00编辑发布,已经有个小可爱看过这篇文章啦


Q -?小数化分数2


Description

悲凉的毛衣 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢??

请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。?

?


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 #include 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;}

?

14267380

《循环小数化分数的公式,循环小数化分数的方法》来自互联网同行内容,若有侵权,请联系我们删除!

  • 互联网
  • 都能
  • 是一个
  • 两种
  • 三种
  • 分别为
  • 不超过
  • 第一个
  • 不可能
  • 我们可以

热门新闻

来电咨询