POJ(1930)(Dead Fraction)(輾轉(zhuǎn)相除法)

鏈接:https://vjudge.net/problem/POJ-1930#author=laguna

思路:要用到數(shù)論,一開始也不懂,貼在這里吧
一,純循環(huán)小數(shù)化分?jǐn)?shù):循環(huán)節(jié)的數(shù)字除以循環(huán)節(jié)的位數(shù)個(gè)9組成的整數(shù)。例如:
0.3333……=3/9=1/3;
0.285714285714……=285714/999999=2/7.
二,混循環(huán)小數(shù):(例如:0.24333333……)不循環(huán)部分和循環(huán)節(jié)構(gòu)成的的數(shù)減去不循環(huán)部分的差,再除以循環(huán)節(jié)位數(shù)個(gè)9添上不循環(huán)部分的位數(shù)個(gè)0。例如:
0.24333333…………=(243-24)/900=73/300
0.9545454…………=(954-9)/990=945/990=21/22

注意到題目中說的循環(huán)節(jié)是可以選定的,要求分母最小,那么可以從最后一位開始枚舉,找到分母最小的即可

代碼:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

int gcd(int a,int b){
    if(a==0)return b;
    return gcd(b%a,a);
}

int main(){
    char str[200];
    int num,k,all,a,b,i,j,mina,minb,l;
    while(cin>>str&&strcmp(str,"0")){
    mina = minb = 1e9;

        for(i=2,all=0,l=0;str[i]!='.';i++){
            all = all*10+str[i]-48;
            l++;
        }

        for(num=all,k=1,i=1;i<=l;i++){
            num/=10;
            k*=10;
            a = all-num;
            b = (int)pow(10.0,l-i)*(k-1);
            j = gcd(a,b);
            if(b/j<minb){//選定分母最小的結(jié)果
                mina = a/j;minb = b/j;
            }

        }
        cout<<mina<<'/'<<minb<<endl;
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容