链接: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<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){//选定分母最小的结果
mina = a/j;minb = b/j;
}
}
cout<<mina<<'/'<<minb<<endl;
}
return 0;
}