程序设计,两个正整数的最大公约数(Greatest Common Divisou,GCD)是能够整除这两个整数的最大的整数。

程序设计,两个正整数的最大公约数(Greatest Common Divisou,GCD)是能够整除这两个整数的最大的整数。编写计算最大公约数的函数Gcd(),在主函数中调用该函数计算并输出从键盘任意输入的两个正整数的最大公约数。
要点分析:
递归方法。对正整数a和b,当a>b时,若a中含有与b相同的公约数,则a中去掉b后剩余的部分a-b中也应含有与b相同的公约数,对a-b和b计算公约数就相当于对a和b计算公约数。反复使用最大公约数的如下3条性质,直到a和b相等为止,这时,a或b就是它们的最大公约数。
性质1 如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd(a,b)=Gcd(a-b,b)
性质2 如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd(a,b)=Gcd(a,b-a)
性质3 如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a,b)= a=b

这个问题个人感觉不需要这么复杂,可以不用分这么多情况。直接用辗转相除法结合递归就可以求出最大公约数了。兄弟搞这么多如果无非就是怕输入的a<b,在递归前用if判断一下保证a>=b就行。

具体代码如下:(附有注释)

#include <stdio.h>
#include<stdlib.h>
#include<math.h>

 int Gcd( int a ,int b );

 main()
{
int a,b;  //储存两个数
int g;  //接收最大公约数

printf("Input a,b:");
scanf("%d,%d",&a,&b);

g=Gcd(a,b);
//增强程序健壮性
if(g==-1)
printf("Input error!\n");
else
printf("%d\n",g);

system("pause");
 }

 //函数功能:计算最大公约数
 int Gcd( int a ,int b )
 {
int t;
//保证a>=b
if(a<b)
{
t=a;
a=b;
b=t;
}

//用递归实现计算最大公约数
if(a<=0||b<=0)
return -1;
else if(a%b==0)
return b;
else
return Gcd(b,a%b);
 }

温馨提示:内容为网友见解,仅供参考
无其他回答

程序设计,两个正整数的最大公约数(Greatest Common Divisou,GCD)是能 ...
具体代码如下:(附有注释)include <stdio.h>#include<stdlib.h>#include<math.h> int Gcd( int a ,int b ); main(){int a,b; \/\/储存两个数int g; \/\/接收最大公约数printf("Input a,b:");scanf("%d,%d",&a,&b);g=Gcd(a,b);\/\/增强程序健壮性if(g==-1)printf("Input...

vb大题,编写一个过程计算两个整数的最大公约数。 求高手解答,表示不会...
private Function GreatestCommonDivitor(byval a as Integer,byval b as integer ) as Integer dim tempMin as Integer dim i as integer dim gcd as integer = 1 '求出较小的那个数 if a>= b then tempMin = b else tempMin = a end if for i = 2 to tempMin 'mod是取余数的运算...

给我讲一下用短除法和辗转相除法求最大公约数
辗转相除法:要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商 q1,余数r1:a÷b=q1…r1我们当然也可以把上面这个式子改写成乘法式:a=b * q1+r1 如果r1=0,那么b就是a、b的最大公约数3。要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:b=r1q2...

相似回答