无限循环小数转分数(纯C)

这是以前帮一个哥们做的考研复试题,还是比较有趣的。

首先输入测试数据组数,然后每一组输入的格式为a.b(c),比如:

10
3.1(3)
0.(3)
1.(25)

输出分数形式:

47/15
1/3
124/99

代码和分析如下:

#include <stdio.h>
#include <string.h>

//按照题目条件,设小数是a.b(c)的,比如3.1(3)但是有可能b是空串,比如0.(10)
//思路,拿3.1(3)举例:x = 3.1(3) ; 10x = 31.(3) ; 100x = 313.(3) ; => 90x = 313.(3) - 31.(3) ,循环节将就这样消去了

void extract(char *str, int *pb, int *pc)
{
    char *p = str;
    *pb = *pc = 0;
    if (*p != ‘(‘) //能得到b
    {
        do
        {
            *pb = *pb * 10 + *p++ - ‘0‘;
        } while (*p != ‘(‘);//直到遇到左括号,说明b读完了
    }
    else //得不到b,只能得到c
    {
        *pb = -1;//用-1表示b读取失败
    }
    p++;//跳过左括号
    do
    {
        *pc = *pc * 10 + *p++ - ‘0‘;
    } while (*p != ‘)‘);//同理取出c,到右括号为止
}

int gcd(int a, int b)//最大公约数
{
    if (!b)
        return a;
    else return gcd(b, a%b);
}

int pow10(int x)//10的x次方
{
    int result = 1;
    while (x--)
        result *= 10;
    return result;
}

int main(void)
{
    int n;
    int a, b, c;
    int M, N, gcd_m_n; //最后结果表示为N/M,因为要化成最简分数所以用gcd_m_n约分
    char buf[16];
    scanf("%d", &n);
    while (n--)
    {
        scanf("%d.", &a);//一定有a,把a和小数点取出,注意是"%d."不是"%d"
        scanf("%s", buf);//剩下的放入缓冲区
        extract(buf, &b, &c);
        // /*测试输入3.1(4) 3.(4)是否识别*/ printf("%d %d %d", a, b, c);
        if (b == -1)
        {
            int c_mul;
            char c_buf[16];
            sprintf(c_buf, "%d", c);
            c_mul = pow10(strlen(c_buf));
            N = c_mul - 1;
            M = a * c_mul + c - a;
            gcd_m_n = gcd(M, N);
            M /= gcd_m_n;
            N /= gcd_m_n;
            printf("%d/%d\n", M, N);
        }
        else
        {
            int b_mul, c_mul;
            char b_buf[16];
            char c_buf[16];
            sprintf(b_buf, "%d", b);
            sprintf(c_buf, "%d", c);
            b_mul = pow10(strlen(b_buf));
            c_mul = pow10(strlen(c_buf));
            N = c_mul * b_mul - b_mul;
            M = a * b_mul * c_mul + b * c_mul + c - a * b_mul - b;
            gcd_m_n = gcd(M, N);
            M /= gcd_m_n;
            N /= gcd_m_n;
            printf("%d/%d\n", M, N);
        }
    }
    return 0;
}
时间: 2024-07-29 08:43:51

无限循环小数转分数(纯C)的相关文章

无限循环小数化分数、

循环小数分为混循环小数.纯循环小数两大类. 混循环小数可以*10^n(n为小数点后非循环位数),所以循环小数化为分数都可以最终通过纯循环小数来转化. 等比数列法编辑 无限循环小数,先找其循环节(即循环的那几位数字),然后将其展开为一等比数列.求出前n项和.取极限.化简. 例如:0.333333…… 循环节为3 则0.33333.....=3*10^(-1)+3*10^(-2)+……+3^10(-n)+…… 前n项和为:0.3(1-(0.1)^(n))/(1-0.1) 当n趋向无穷时(0.1)^(

【The beauty of math】无限循环小数转分数

0.333333... = 1/3 推导过程: 设x=0.333333 10x=3.333333(循环体的数字个数为1) 10x-x=3 x=1/3 所以计算的核心在于确定无限循环的循环体的数字个数. [The beauty of math]无限循环小数转分数,布布扣,bubuko.com

如何将无限循环小数转换为分数

将一个无限循环小数转换为分数 例如: 32.5632323232......... 1.设x=32.5632323232......... 则 y=x*10000 y=325632.32323232..... 2. z=x*100 z=3256.3232323232....... 3. y-z=322376  //注意,这里的小数部分被抵消了 y-z=10000x-100x 也就是9900x=322376 x=322376/9900 然后对分式化简得最简表达式 化简分式可以用辗转相除法求出最大公

将无限循环小数化为分数

众所周知,有限小数是十进分数的另一种表现形式,因此,任何一个有限小数都可以直接写成十分之几.百分之几.千分之几……的数.那么无限小数能否化成分数? 首先我们要明确,无限小数可按照小数部分是否循环分成两类:无限循环小数和无限不循环小数.无限不循环小数不能化分数,这在中学将会得到详尽的解释:无限循环小数是可以化成分数的.那么,无限循环小数又是如何化分数的呢?由于它的小数部分位数是无限的,显然不可能写成十分之几.百分之几.千分之几……的数.其实,循环小数化分数难就难在无限的小数位数.所以我就从这里入手

一种将无限循环小数快速转换为分数的方法

问题描述: 将任意无限循环小数转换为分数.例如0.121121121........=121/999 算法综述: 前面有一篇博文抱着娱乐态度证明了0.9999...=1 ,证明过程既不严谨.但由此可想到一种将任意无限循环小数快速转为分数的方法. 首先回顾下0.9999...=1 的证明过程: 证明: 令a=0.99999...(无限循环) 则10a=9.99999...(无限循环) 10a-a=9.99999...(无限循环)-0.99999...(无限循环)=9=9a 所以a=1 换汤不换药:

如何把一个无限循环小数转换成一个分数(算法)

循环小数如何化分数众所周知,有限小数是十进分数的另一种表现形式,因此,任何一个有限小数都可以直接写成十分之几.百分之几.千分之几……的数.那么无限小数能否化成分数? 首先我们要明确,无限小数可按照小数部分是否循环分成两类:无限循环小数和无限不循环小数.无限不循环小数不能化分数,这在中学将会得到详尽的解释:无限循环小数是可以化成分数的.那么,无限循环小数又是如何化分数的呢?由于它的小数部分位数是无限的,显然不可能写成十分之几.百分之几.千分之几……的数.其实,循环小数化分数难就难在无限的小数位数.

无限循环小数POJ1930

题意:给定一个无限循环小数,求其分数形势,要求分母最小 分析:看了别人的题解才做出来的,将无限循环小数转化成分数,分为纯循环和混循环两种形式. (1)对于纯循环:用9做分母,有多少个循环数就几个9,比如0.3,3的循环就是9分之3,0.654,654的循环就是999分之654, 0.9,9的循环就是9分之1,以此类推. (2)混循环:用9和0做分母,首先有几个循环节就几个9,接着有几个没加入循环的数就加几个0,再用小数点后面的数减 没加入循环的数,比如0.43,3的循环,有一位数没加入循环,就在

UVA 10555 - Dead Fraction(数论+无限循环小数)

UVA 10555 - Dead Fraction 题目链接 题意:给定一个循环小数,不确定循环节,求出该小数用分数表示,并且分母最小的情况 思路:推个小公式 一个小数0.aaaaabbb... 表示为n/m形式,并且a为整数部分有c位, b为小数部分有d位 那么aaaaa.bbb...和aaaaabbb....分别可以表示为10c?(n/m)和10c+d?(n/m) 两式相减得:aaaaabbb?aaaaa=(10c+d?10c)(n/m) 那么设n1 = aaaaabbb ,n2 = aaa

(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 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以