小數(包括循環小數)轉化爲分數方法,nyoj 1199

題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1199

又是一個漲知識的題目,小數變分數很好的知識。

一下爲百度內容,寫的很好貼過來。加上很自己的理解。


對於純循環小數,轉換方法是:循環節做分子;分母全是9,9的個數爲循環節長度。。再約分即可
例:0.1111111...=1/9, 我自己的理解是,10%9=1, 10%9=10,......很有可能很多人都不知道我在說什麼。。。。自己理解下就ok了。
0.123 123 123....=123/999=41/333
0.35 35 35..=35/99

對於混循環小數,轉換方法是:分子爲兩數(非循環部分+循環部分,和循環部分)之差-----被減數:小數點後第一位的數直到第一個循環節結束,這幾個數字構成的數作爲被減數;減數:未參與循環的小數部分,分母由9和0組成,9的個數爲循環節長度,0的個數爲未循環部分長度。。再約分即可

例:0.1 23 23 23 23....=(123-1)/990=122/990=61/495
0.73 865 865 865...=(73865-73)/99900=73792/99900=18448/24975
0.32 11111111...=(321-32)/900=289/900


很好很強大的一道題。。

加上自己的code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
using namespace std;
typedef long long INT;
const INT _10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
const INT _9[] = {1, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999};

INT gcd(INT a, INT b)
{
    if(b == 0) return a;
    return gcd(b, a % b);
}
int main()
{
//    freopen("1.txt", "r", stdin);
    INT T;
    cin >> T;
    while(T --){
        INT n, m, x, y;
        cin >> n >> m >> x >> y;
        INT fenz = x * _10[m] + y - x;
        INT fenm = _9[m] * _10[n];
        INT fen = gcd(fenz, fenm);
        printf("%lld / %lld\n", fenz / fen, fenm / fen);
    }
    return 0;
}

待續未完。。。。。後續補充分數變小數(可能是循環的小數)的內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章