void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一个有限循环小数的一部分,然后让你计算出分数....因为没有指定循环部分,题目要求所给的结果中分母最小的那一个

这题比较繁琐,需要一个一个去枚举,然后比较出分母最小的那一个,因此需要两层循环去计算非递归部分和递归部分

#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;
}

posted on 2011-04-14 13:51  void-man  阅读(455)  评论(0)    收藏  举报