一个C++问题,高手务必帮忙

来源:百度知道 编辑:UC知道 时间:2024/05/16 12:23:44
在书上看到函数的章节,然后书上有一个求两个数之间的最大公约数的程序,程序如下:
int gcd (int v1,int v2)
{ while (v2){
int temp = v2 ;
v2=v1%v2;
v1=temp
} return v1;
}

1, 在上面这个程序中 ,“while (v2)” 是什么意思?? 如果是
v2 ?? 这该怎么理解 ? 又又在什么时候结束这个循环?
2, 我知道最大公约数怎么求,可是书上给的这个程序是怎么求的最大
公约数?

按我的理解来读一下这个程序吧: 如果是 v2 , 那么 定义
temp = v2 , 然后v2 = v1 % v2 的余数 , 然后v1 = temp ,

我想如果按我这么读的话,那一定是错误的,根本没逻辑,又不知道最 后求的是什么!

所以请高手务必帮帮我,简单易懂的告诉我每段代码都是什么意思!!

该怎么理解这段求公约数的程序!

这些问题缠绕我很久 在这里谢谢了!

其实你要明白这段程序的话,就要先知道数学上是怎么求解最大公约数的。
首先,设两个数,n1>n2
n1%n2=余数m。
而n1和n2的最大公约数就是余数m和n2的最大公约数。这个关键,要理解。
例如:
n1=110,n2=45
n1%n2=20
n1和n2的最大公约数为5
余数和n2的最大公约数为5
-------------------------------------------------------------
如果上面的原理明白了,下面分析程序。

while (v2){
int temp = v2 ;
v2=v1%v2;
v1=temp
}
这个程序其实算是递归算法了。

首先,这个程序会保证v2的值小于v1。
假如v2大于v1,循环一次之后,两个值就交换了。

然后,求v1%v2的余数(如20),余数存入v2,temp存入v1(如45),再一次循环时,就相当于求余数v2(如20)和v1(如45)的最大公约数。

最后,递归算出两数的最大公约数。

这样详细写,希望你明白了。

百度一下辗转相除法

我国的经典理论,不懂可惜啊