鏈接: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;
}