开始这题我是想到的是以前奥数学的那种把循环小数化分数的...那么分母就应该是(99...00)的形式..既然如此..那么找到能被分母整除的最小(99...00)...然后再算出对应的分子..再展开成循环小数...真的很eggache阿...写了一大段..结果都没调出来..
再一想..其实这题只要手动模拟做除法..每次记下除数和余数..再找到有相同余数的就可以了~~而且题目所给的范围<=100000..而根据鸽巢原理,最多要做的模拟运算时100001..表示完全能接受..
有点恶心的输出...要注意...
Program:
/*  
ID: zzyzzy12  
LANG: C++  
TASK: fracdec
*/    
#include<iostream>    
#include<stdio.h>    
#include<string.h>    
#include<math.h>    
#include<stack>
#include<algorithm>    
#include<queue> 
using namespace std;     
int x,y,g;
int gcd(int x,int y)
{
     if (y==0) return x;
     return gcd(y,x%y);   
} 
void getanswer()
{
     int p,t,i,a[100001],b[100001],num,n;
     long long k;
     memset(b,-1,sizeof(b));
     if (x/y>0) n=(int)log10(x/y)+2;
     else n=2;
     printf("%d.",x/y); 
     x%=y;
     if (y==1) { printf("0\n");  return; } 
     t=x;  num=0;  b[x]=0;
     while (1)
     {
            t*=10;
            a[++num]=t/y;
            t-=a[num]*y;   
            if (t==0) break;
            if (b[t]>=0) 
            {
                   p=b[t];
                   break;          
            }
            b[t]=num;
     }  
     if (t!=0)
     { 
            for (i=1;i<=p;i++) 
            {
                   printf("%d",a[i]);
                   n++;
                   if (n%76==0) printf("\n");
            }
            printf("(");  
            n++;
            if (n%76==0) printf("\n"); 
            for (i=p+1;i<=num;i++) 
            {
                   printf("%d",a[i]);
                   n++;
                   if (n%76==0) printf("\n");
            }                   
            printf(")");
     }else  
     for (i=1;i<=num;i++)
     {
            printf("%d",a[i]);  
            n++;
            if (n%76==0) printf("\n");
     }       
     if (n%76) printf("\n");           
}
int main()
{
     freopen("fracdec.in","r",stdin);  
     freopen("fracdec.out","w",stdout);     
     scanf("%d %d",&x,&y);  
     g=gcd(x,y);
     x/=g;  y/=g;
     getanswer();
     return 0;   
}
 
                   
                   
                   
                   
                             本文介绍了一种将循环小数转换为分数形式的有效算法。通过手动模拟除法过程并利用鸽巢原理来找到循环节,该算法能够在有限步内完成转换。特别地,文章提供了一个C++实现示例。
本文介绍了一种将循环小数转换为分数形式的有效算法。通过手动模拟除法过程并利用鸽巢原理来找到循环节,该算法能够在有限步内完成转换。特别地,文章提供了一个C++实现示例。
           
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   719
					719
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            