标题:求最大公约数——不要骂我啊,水平烂
只看楼主
qhscqb
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2007-2-3
得分:0 
我的算法
main()
{
    int a,b,i,k,s;
    int gys(int a,int b);
    int gbs(int a,int b);
    printf("Please input two number:\n");
    scanf("%d %d",&a,&b);
    k=gys(a,b);
    s=gbs(a,b);   
    printf("gys=%d,gbs=%d\n",k,s);
    getch();/*win-tc*/
}
int gys(int a,int b)/*定义求最大公因数的函数*/
{
    int i,k,t;
    if (a>b){t=a;a=b;b=t;}/*当a>b时将ab互换,保证最大公因数不会大于最小数*/
    for (i=1;i<=a;i++)
    {
        if(a%i==0 && b%i==0) k=i;
    }
    return k;
}
int gbs(int a,int b)/*最小公倍数*/
{
    int i,s,t;
    if(a>b){t=a;a=b;b=t;}
    for (i=1;i<=a*b;i++)
    {
        if(b*i % a==0) {s=b*i;break;}
    }
    return s;
}

编程快乐,快乐编程! 没有最好,只有更好!
2008-04-18 11:02
Daocaoren
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-4-18
得分:0 
求最大公约数
/*Greatest_Common_Divisor_1*/
int gcd(int a,int b)
{
   int t,i;
   if(a<b) {t=a;a=b;b=t;}
   for(i=b;i>0;i--)
   {if(a%i==0 && b%i==0) break;}
   return(i);
}

/*Greatest_Common_Divisor_2*/
int gcdz(int a,int b)
{
  int t,i;
  if(a<b) {t=a;a=b;b=t}
  for(i=1;a-i*b>0;i++)
  if(a%(a-i*b)==0 && b%(a-i*b)==0)
  return(a-i*b);
}

/*Greatest_Common_Divisor_3*/
int gcd(int a, int b)
{
    if (b > 0) {return gcd(b, a % b); }
    return a;
}

/*Greatest_Common_Divisor_4*/
int gcd(a,b)
{
    int t;
    while(b!=0) {t=b;b=a%b;a=t;}
    return a;
}

/*Greatest_Common_Divisor_5*/
int gcd(int a,int b)
{
    if(a==0) return(b);
    while(b!=0)
    {
       if(a>b) a-=b;
       else b-=a;
    }
    return a;


}
2008-04-18 20:22
Daocaoren
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-4-18
得分:0 
还有一点,公约数定义在整数范围内,而非正数范围内。上面的算法没有考虑这一点,可以用绝对值函数搞定。

[[it] 本帖最后由 Daocaoren 于 2008-4-22 18:09 编辑 [/it]]
2008-04-18 20:25
beyond0702
Rank: 1
来 自: 桂 林
等 级:新手上路
帖 子:219
专家分:0
注 册:2007-11-17
得分:0 
其实LZ的思路不错的,用不着什么展转法。
改一下,代码就能运行了

#include <stdio.h>
void main()
{
    int a,b,c,x,y;
     int i=1;
    printf("请输入两个正整数\n");
    scanf("%d %d",&a,&b);
    if (a>0&&b>0)
    {   
        c=a<b?a:b;
       i=c;  /* 这里是倒着找,这样就可以节省好多的时间了*/      
    while (i>1)
    {
        x=a%i;y=b%i;
        i--;
        if (x==0&&y==0)
        {printf ("最大公约数是%d\n",i);break;}
    }
    if(i==1)printf ("无最大公约数\n");
    }
else printf("两个数不合法\n");
}
2008-04-25 01:45
xteet
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-9-12
得分:0 
三楼还有个问题,只要是约数就会输出,最好用i--,再加个break;在输出无最大公约数前加一个条件。
新手,请大家海涵。
2008-04-25 08:56



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




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

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