POJ(1930)(Dead Fraction)(辗转相除法)

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

思路:要用到数论,一开始也不懂,贴在这里吧
一,纯循环小数化分数:循环节的数字除以循环节的位数个9组成的整数。例如:
0.3333……=3/9=1/3;
0.285714285714……=285714/999999=2/7.
二,混循环小数:(例如:0.24333333……)不循环部分和循环节构成的的数减去不循环部分的差,再除以循环节位数个9添上不循环部分的位数个0。例如:
0.24333333…………=(243-24)/900=73/300
0.9545454…………=(954-9)/990=945/990=21/22

注意到题目中说的循环节是可以选定的,要求分母最小,那么可以从最后一位开始枚举,找到分母最小的即可

代码:

#include
#include
#include
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

你可能感兴趣的:(POJ(1930)(Dead Fraction)(辗转相除法))