求解最大公因数(网络空间安全概论)

  1. 题目描述

编写程序实现计算两个整数a 与 b 的最大公因数 d=(a,b),要求即使 a 与 b 中的一个等于零,程序也应该正常运行。用你编写的程序求解 GCD(1234,5678),GCD(16534528044,8332745927).

二、设计思路

利用辗转相除法实现。即用较小数除较大数,再用出现的第一个余数去除除数,再用出现的第二个余数去除第一个余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

欧几里得算法的原理如下:

三、运行结果

四、遇到的困难及解决办法

遇到的问题:

开始我写的代码如下图所示,用的变量是int型的,在运行GCD(1234,5678)结果是正确的,但是运行到GCD(16534528044,8332745927)时结果就错了!然后进行单步调试,发现a,b的值都是错的,就意识到int型变量是4个字节32位二进制数,它所能表示的最大整数是4294967295。后面就将变量改为了double类型的,但是double类型无法使用取余操作符,故后面更改代码。

后面又将代码改为下图所示

最终得到的结果总为0,后经过调试,当r=0后,后面的代码还会继续进行,也就是会将r=0的值赋给b,所以结果总为0;后将a=b,b=a的代码放在了r!=0的条件里执行,这样就不会出现上面的情况。

五、源程序

猜你喜欢

转载自blog.csdn.net/weixin_52732185/article/details/129133794