小数化分数~-~

小数化分数,嗯。

看到这题,多思考。。(careful consideration;deliberate;thoughtful

普通小数就不用说了吧, 有几位除以1后带几位零的数。

循环真是怎么办好呢,好多呢,算不出来吧,我也不会。那就删了好了。

怎么删呢?

copy:case

⑴    把0.4747……和0.33……化成分数。

想1:        0.4747……×100=47.4747……  

0.4747……×100-0.4747……=47.4747……-0.4747……

(100-1)×0.4747……=47

即99×0.4747…… =47

那么  0.4747……=47/99



想2: 0.33……×10=3.33……

0.33……×10-0.33……=3.33…-0.33……

(10-1) ×0.33……=3

即9×0.33……=3

那么0.33……=3/9=1/3

由此可见, 纯循环小数化分数,它的小数部分可以写成这样的分数:纯循环小数的循环节最少位数是几,分母就是由几个9组成的数;分子是纯循环小数中一个循环节组成的数。

⑵把0.4777……和0.325656……化成分数。

想1:0.4777……×10=4.777……①

0.4777……×100=47.77……②

用②-①即得:

0.4777……×90=47-4

所以, 0.4777……=43/90



想2:0.325656……×100=32.5656……①

0.325656……×10000=3256.56……②

用②-①即得:

0.325656……×9900=3256.5656……-32.5656……

0.325656……×9900=3256-32

所以, 0.325656……=3224/9900

将纯循环小数改写成分数,分子是一个循环节的数字组成的数;分母各位数字都是9,9的个数与循环节中的数字的个数相同.

  将混循环小数改写成分数,分子是不循环部分与第一个循环节连成的数字组成的数,减去不循环部分数字组成的数之差;分母的头几位数字是9,末几位数字是0,9的个数跟循环节的数位相同,0的个数跟不循环部分的数位相同.

copy not ending:

AK 代码:

#include<iostream>

using namespace std;

int f(int a, int b)
{
    while(a%b)
    {
        int w = a % b;
        a = b;
        b = w;
    }
    return b;
}
int main()
{
    int t;


    cin >> t;

    while(t--)
    {
        char str[15];
        cin >> str;
        int x= 0, y = 0, p = 0, q = 0, a = 1, b = 1, m, w = 0, d, s;
        for(int i = 2; str[i] != ''; i++)
        {
            if(!w && str[i] != '(')
            {
                p++;
                x *= 10;
                x += str[i] - '0';
            }
            if(w && str[i] != ')')
            {
                q++;
                y *= 10;
                y += str[i] - '0';
            }
            if(str[i] == '(')
            {
                w = 1;
                y = x;
                q = p;
            }
        }
        if(!q)
        {
            while(p--)
                a *= 10;
            m = f(x, a);
            a /= m;
            x /= m;
            cout << x << '/' << a << endl;
        }
        else
        {
            d = y-x;
            while(p--)
                a*=10;
            while(q--)
                b*=10;
            s = b-a;
            m = f(d, s);
            s /= m;
            d /= m;
            cout << d << '/' << s << endl;
        }
    }
    return 0;
}

(当然代码是自己打出来的,思路什嘛的完全完全摘自博客:

http://blog.163.com/huangzhifei2009@126/blog/static/12376126720097316513817/

让未来到来 让过去过去
原文地址:https://www.cnblogs.com/Tinamei/p/4385002.html