您的位置:首页 > 其它

小数化分数2

2016-05-08 22:40 260 查看

小数化分数2

题目

Problem 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

由上述两个例子我们可以发现,纯循环小数化成分数过后其分子就为所
4000
循环单元化成的数,分母则全由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

下面贴代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学 C