用递推方式求两个正整数的最大公约数中有一点看不懂,请看补充:

来源:百度知道 编辑:UC知道 时间:2024/05/18 08:18:00
#include <stdio.h>
int gcd(int m,int n);
void main()
{int num1,num2,t;
printf("input num1,num2:");
scanf("%d%d",&num1,&num2);
if(num1,num2)/*这和下面是逗号表达式吧,它是怎样比较两个的数的大小的,我看不懂下面的一行的代码,请帮忙!*/
num1=num1+num2,num2=num1-num2;num1=num1-num2;
printf("%d\n",gcd(num1,num2));
getch();
}
int gcd(int m,int n)
{int r;
while((r=m%n)!=0)
{m=n;
n=r;
}return n;
}
谢谢两位,if(num1,num2) num1=num1+num2,num2=num1-num2;num1=num1-num2; 这一行删掉也可运行出正确结果,难道这行没有用吗,在删掉之后,为什么当num1<num2时这程序也对?

这是求两个数的最大公约数的程序。
先输入两个数字a,b,经过num1=num1+num2,num2=num1-num2;num1=num1-num2的计算,我们可以得到num1=a+b,num2=(a+b)-b=a,num1=(a+b)-a=b;也就是说,如果输入的两个数,前者num1小于后者num2,则需要两个数互换位置,即要保证第一个数大于第二个数,只有这样,才能抱着函数gcd的顺利执行。
函数gcd的意思是,如果m是n的倍数,则函数直接返回n,否则,函数返回m与n的“余数”。这是利用的数学上求两个数的最大公约数的“辗转相除法”得到的程序结构。这里我所说的余数,并不是单纯的一次相除的余数,而是要一直除到所得到的r值为n的约数为止。
如果楼主在程序上精通一些,我想我是说明白了,如果楼主不明白的话,请ps我。

num1=num1+num2,num2=num1-num2;num1=num1-num2; 这行代码是交换的意思
相当于t=num1;num1=num2;num2=t;