给出一个有限循环小数的一部分,然后让你计算出分数....因为没有指定循环部分,题目要求所给的结果中分母最小的那一个
这题比较繁琐,需要一个一个去枚举,然后比较出分母最小的那一个,因此需要两层循环去计算非递归部分和递归部分
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
long long gcd(long long a, long long b)
{
if(a<b)//arrange so that a>b
{
int temp = a;
a = b;
b=temp;
}
if(0==b)//the base case
return a;
if(a%2==0 && b%2 ==0)//a and b are even
return 2*gcd(a/2,b/2);
if ( a%2 == 0)// only a is even
return gcd(a/2,b);
if ( b%2==0 )// only b is even
return gcd(a,b/2);return gcd((a+b)/2,(a-b)/2);// a and b are odd
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
char s[20];
while(scanf("%s",s) && strcmp(s,"0"))
{
int i,j,len=strlen(s)-3;
long long ans_a=1e20,ans_b;
long long a,b,aa,bb,t;
for(i=0; i<len-2; i++)//设定循环次数,去除前面的0.
{
a=1;
b=0;
for(j=2; j<=i+1; j++)//求出非循环部分的位数a,以及值b
{
a*=10;
b = b*10 + s[j]-'0';
}
aa=0;
bb=0;
for(j=i+2; j<len; j++)//求出循环部分的位数aa,以及值bb
{
aa = aa*10+9;
bb = bb*10+s[j]-'0';
}
//printf("a=%lld b=%lld aa=%lld bb=%lld ",a,b,aa,bb);
if(aa)
{
b = b*aa+bb;
aa *= a;
a = aa;
}
//printf (" newa=%lld newaa=%lld newb=%d\n",a,aa,b);
t=1;
if(b)
t = gcd(a,b);
a/=t;
b/=t;
if(a<ans_a)
{
ans_a=a;
ans_b=b;
}
}
if(ans_b==0)
ans_a=1;
printf("%lld/%lld\n",ans_b,ans_a);
}
return 0;
}

浙公网安备 33010602011771号