标题:修正“求最大公约数和最小公倍数”: C经典算法: 欧几里德算法(辗转相除法)
只看楼主
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
 问题点数:0 回复次数:9 
修正“求最大公约数和最小公倍数”: C经典算法: 欧几里德算法(辗转相除法)
我上次写了个求最大公约数和最小公倍数,后经高手指点,发现其效率很低.所以查询资料,找到了这个c的经典算法,拿出来和和我一样菜的兄弟们分享一下:
#include <stdio.h>
int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}
int main(void) {
    int m, n, max, temp;
    printf("Please input two numbers:\n");
    scanf("%d%d", &n, &m);
    if (m < n) {
        temp = m;
        m = n;
        n = temp;
    }
    max = gcd(m, n);
    printf("The max commom divisor is: %d", max);
    printf("\n The min common multiple is: %d", m * n / max);
}
搜索更多相关主题的帖子: 欧几里德 除法 算法 最大公约数 最小公倍数 
2008-03-13 09:52
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
其实把辗转相除法弄懂了就好了。。。。呵呵。。你很认真。。。

学习需要安静。。海盗要重新来过。。
2008-03-13 10:18
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
得分:0 
写个非递归的试试

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-03-13 10:24
蓝色神话
Rank: 2
等 级:论坛游民
威 望:1
帖 子:404
专家分:24
注 册:2006-5-11
得分:0 
非递归用循环就行!
2008-03-13 10:39
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
恩。。。用while就好了

学习需要安静。。海盗要重新来过。。
2008-03-13 10:48
szwgeneral
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-8-1
得分:0 
求教
#include<stdio.h>
main()
{
    int max(int a,int b);
    long int min(int a,int b);
    int p,q,M,m;
    printf("请输入两个数   (以逗号间隔)【功能:求最大公约数和最小公倍数】\n\n");
    scanf("%d,%d",&p,&q);
    M=max(p,q);
    m=min(p,q);
    printf("\n\n最大公约数  =  %d\n\n",M);
    printf("\n\n最小公倍数  =  %d\n\n",m);

 }

int max(int a,int b)
{
    int c,i,d;
    if(a>b)  c=b;
    else c=a;
    for(i=1;i<=c;i++)
    {
        if(a%i==0 && b%i==0) d=i;
    }
    
    
   return(d);
    
}    

 long int min(int a,int b)
 {
     long int c,i,d;
      if(a>b)  c=b;
     else c=a;
      for(i=c;;i++)
     {if(i%a==0 && i%b==0)  d=i;break;    
     }
     return(d);
 }

最小公倍数有点问题,请哪位大哥指教
2008-08-01 13:57
elan1986
Rank: 6Rank: 6
等 级:贵宾
威 望:18
帖 子:458
专家分:407
注 册:2007-12-17
得分:0 
main()
{
    int a,b,i,c,m,n;
    printf("input two number:");
    scanf("%d%d",&a,&b);
    if(b<a)
        {
            c=a; a=b; b=c;
        }
    for(i=a;i>0;i--)
        {
            if(a%i==0)
                m=i;
            if(b%i==0)    
                n=i;
            if(n==m) break;
        }
    printf("%d",n)
}

看看这个
希望对你有所帮助!
PS:int max(int a,int b)
{
    int c,i,d;
    if(a>b)  c=b;
    else c=a;
    for(i=1;i<=c;i++)
    {
        if(a%i==0 && b%i==0) d=i;
    }
   
   
   return(d);
   
}   

程序里面那个IF判断有问题
2008-08-01 15:02
cs8728205
Rank: 2
来 自:北京市海淀区
等 级:论坛游民
帖 子:23
专家分:11
注 册:2010-1-29
得分:0 
回复 6楼 szwgeneral
#include<stdio.h>
main()
{
    int max(int a,int b);
    long int min(int a,int b);
    int p,q,M,m;
    printf("ÇëÊäÈëÁ½¸öÊý\n\n");
    scanf("%d%d",&p,&q);
    M=max(p,q);
    m=min(p,q);
    printf("\n\n×î´ó¹«Ô¼Êý  =  %d\n\n",M);
    printf("\n\n×îС¹«±¶Êý  =  %d\n\n",m);

}

int max(int a,int b)
{
    int c,i,d;
    if(a>b) c=b;
    else c=a;
    for(i=1;i<=c;i++)
    {
        if((a%i==0) && (b%i==0)) d=i;
    }
   
   
   return(d);
   
}   

long int min(int a,int b)
{
     long int c,i,d;
     if(a>b)  c=b;
     else c=a;
     for(i=1;i<=c;i++)
     {
         if((i%a==0) && (i%b==0))  d=i;   
     }
     return(a*b/d);//最小公倍数等于两数之积除以最大公约数
}

宁静致远

2010-08-30 23:50
llj01261983
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-9-6
得分:0 
if语句有问题
2010-09-06 14:47
天丛云
Rank: 2
等 级:论坛游民
帖 子:48
专家分:50
注 册:2016-11-8
得分:0 
回复 楼主 mqh21364
怎么看这个递归有点奇怪。
2016-12-16 18:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-203162-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.198859 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved