题目描述
编写程序实现计算两个整数a 与 b 的最大公因数 d=(a,b),要求即使 a 与 b 中的一个等于零,程序也应该正常运行。用你编写的程序求解 GCD(1234,5678),GCD(16534528044,8332745927).
二、设计思路
利用辗转相除法实现。即用较小数除较大数,再用出现的第一个余数去除除数,再用出现的第二个余数去除第一个余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
欧几里得算法的原理如下:
![](https://i-blog.csdnimg.cn/blog_migrate/b3420a446afa52d333ae9b051b50006f.png)
三、运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/11761b4a3ff35271eacdd77e44115551.png)
![](https://i-blog.csdnimg.cn/blog_migrate/05377dcdc2a34b21106c1f214b398cc1.png)
四、遇到的困难及解决办法
遇到的问题:
开始我写的代码如下图所示,用的变量是int型的,在运行GCD(1234,5678)结果是正确的,但是运行到GCD(16534528044,8332745927)时结果就错了!然后进行单步调试,发现a,b的值都是错的,就意识到int型变量是4个字节32位二进制数,它所能表示的最大整数是4294967295。后面就将变量改为了double类型的,但是double类型无法使用取余操作符,故后面更改代码。
![](https://i-blog.csdnimg.cn/blog_migrate/337c8fda10378675583a4f8662ad160c.png)
后面又将代码改为下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/da9f07e6ce71fc262807a4c7bc89e787.png)
最终得到的结果总为0,后经过调试,当r=0后,后面的代码还会继续进行,也就是会将r=0的值赋给b,所以结果总为0;后将a=b,b=a的代码放在了r!=0的条件里执行,这样就不会出现上面的情况。
五、源程序
![](https://i-blog.csdnimg.cn/blog_migrate/9d27dc814585b6211f60637aec96653a.png)