说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

按升序打印出所有分子分母由1..n中的整数构成的最简真分数,不许先举出再排序,这道题大家有什么好意见,100分相求,即刻给分!

编辑:说三道四文库 发布时间:2018-04-23 05:56
HTML文档下载 WORD文档下载 PDF文档下载
好比n=5,那么就是

1/5  1/4  2/5  1/3  1/2  2/3  3/5  4/5

关键是不许先举出再排序。有什么好算法?
;this function will return c/d that following a/b.
void next(int a,int b,int n, int& c,int& d)
{
   int i;
   int max_i=1;
   int max_r=a%b;
   int r=max_r;
   for(i=2;i<=n;i++){
       r+=b;
       if(r>b)r-=b;
       if(r>max_r){
         max_r=r;
         max_i=i;
       }
   }
   d=max_i;
   c=(a*d+d-1)/b;
}


#define N 5
int main()
{
   int a,b;
   a=1;b=N;
   do
   {
      next(a,b,N,&a,&b);
   }while(a!=N||b!=1);
   return 0;
}
刚才不对,这个怎么样

void next(int a,int b,int n, int* c,int* d)
{
   int i;
   int max_i=1;
   int max_r=a%b;
   int r=max_r;
   for(i=2;i<=n;i++){
       r+=a;
       if(r>=b)r-=b;
       if((b-r)*max_i<(b-max_r)*i){
         max_r=r;
         max_i=i;
       }
   }
   *d=max_i;
   *c=(a* *d+ b-1)/b;
}


#define N 5
int main()
{
   int a,b;
   a=1;b=N;
   do
   {
   printf("%d/%d\n",a,b);
      next(a,b,N,&a,&b);
   }while(a!=1||b!=1);
   return 0;
}
for(i=2;i  <=n;i++){  
             r+=a;  
             if(r  >=b)r-=b;  
             if((b-r)*max_i  <(b-max_r)*i){  
                 max_r=r;  
                 max_i=i;  
             }  
这段里给我注释看看可以么?我没看明白。
如果N不大,可以先求出1到N的最大公倍数M,然后输出i/M,i从1到M-1。
在输出时,先要将i/M化简为x/y,若y>N,则不用输出。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘