小数化分数2

小数化分数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

    由上述两个例子我们可以发现,纯循环小数化成分数过后其分子就为所循环单元化成的数,分母则全由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;
}
时间: 2024-10-23 17:25:41

小数化分数2的相关文章

hdu1717 小数化分数2

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1717 小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2921    Accepted Submission(s): 1187 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式

HDU1717小数化分数2

小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4278    Accepted Submission(s): 1725 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以

(hdu step 2.1.8)小数化分数2(小数化分数——包括了循环小数化分数的情况)

题目: 小数化分数2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2783 Accepted Submission(s): 993   Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以

hdu 1717 小数化分数2 (数论)

点我点我点我!!! 接下来要做的就是模拟上述过程了. 静下来想一下自己要得到的信息. 然后拿出来,就可以了,模拟嘛,都是这样的. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char str[20]; int gcd(int a,int b) { return a%b==0?b:gcd(b,a%b); }

hdu1717 小数化分数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1717 小数化分数2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5375    Accepted Submission(s): 2188 Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他

ACM学习历程—HDU1717 小数化分数2(gcd)

Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数. Input 第一行是一个整数N,表示有多少组数据. 每组数据只有一个纯小数,也就是整数部分为0.小数的位数不超过9位,循环部分用()括起来. Output 对每一个对应的小数化成最简分数后输出,占一行. Sample Input 3 0.(4) 0.5

【HDOJ】1717 小数化分数2

简单字符串处理. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <ctype.h> 5 6 #define MAXN 25 7 char str[MAXN]; 8 int ten[15]; 9 10 int gcd(int m, int n) { 11 if (m == 0) 12 return n; 13 if (m > n) 14 return gcd(

HDU 1717 小数化分数2

http://acm.hdu.edu.cn/showproblem.php?pid=1717 之前莫名WA了挺多次的有趣的题orz 感觉还是写麻烦了 注意字符串处理 代码:  0MS  1068K #include <cstdio> #include <cstring> using namespace std; int gcd(int m, int n) { int r; while (n) { r = m % n; m = n; n = r; } return m; } int

(小数化分数)小数化分数2 -- HDU --1717

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1717 举例: 0.24333333…………=(243-24)/900=73/3000.9545454…………=(954-9)/990=945/990=21/22 代码: #include<stdio.h> #include<string.h> #define N 110 int gcd(int a, int b) { return b==0?a:gcd(b, a%b); } int ma