c语言函数迭代求解最大公约数
这是第二次更新,本次会讲解两种求解最大公约数如何用c语言进行求解,请各位读者体验两种方法的差异以及函数迭代的思想,欢迎各位读者批评质疑和提问。
第一种解法
假定现在有2个整数,要求两个数的最大公约数,最直观容易想到的方法就是逐一进行列举,因为找最大的,所以从所给数进行递减的方式来测试哪一个数字最先会整数两个数字。
现给定两个整数a,b
那么a与b的最大公约数一定小于等于a,b中较小的那一个,因此我们从a,b中较小的数开始进行寻找。
由于要逐个进行测试,我们设定一个循环变量假定为i
#include<stdio.h>
int main()
{
int a=0,b=0,i=0;
scanf("%d %d",&a,&b);
这里完成了对a,b,i的定义。
通过条件判断语句来对a,b中较大的进行选择
if(a>=b)
余下的情况使用else即可,这里以a>=b的情况来讨论
当a大于等于b时,我们让循环变量i从b开始,这里的i也就是除数,随着i的递减,如果i将a和b同时整除,那么这个i就是a与b的最大公约数,找到后记得要跳出循环,否则i将继续递减
if(a>=b)
{
for(i=b;i>=1;i--)
{
if((a%i==0)&&(b%i==0))
{
printf("%d\n",i);
break;
}
}
}
else的情况与此情况类似,此处不做赘述
第二种方法(迭代)
这里采用欧几里得算法(也叫辗转相除法),原理是通过初等数论知识推导而来,这里不作为重点来讲解,感兴趣的读者可自行查阅资料,这里重点来感受迭代在代码中的运用
对于辗转相除法,这里举一个例子,对于整数252和198,252/198=1余数为54,下一步是将上一个式子的除数作为下一个式子的被除数而上一个式子的余数作为下一个式子的除数即得198/54=3余数为36,接下来是54/36=1余数为18,36/18=2余数为0,当余数为0时,这时所得式子的除数也就是倒数第二个式子的余数为18也就是252和198的最大公约数
根据以上理论我们可以写出以下代码
int c=a%b;
a=b;
b=c;
此处a和b为给定的两个整数,c为两者相除所得余数,通过将b的值赋给a,c的值赋给b实现辗转相除,不过仅一次并不一定能够得到余数为0的式子,所以要循环起来,而循环的结束条件也就是(a%b)=0
int GCD(int a,int b)
{
while(a%b!=0)
{
int c=a%b;
a=b;
b=c;
}
return b;
}
这里将他写在GCD函数内,返回类型为int,返回值为起始作为除数的b,方便函数链式调用
这里我们还可以给出a,b两个整数的最小公倍数如何求解,即a,b两个数的最小公倍数LCM(a,b)=a*b/GCD(a,b),读者可通过以上内容再结合此公式尝试计算
最后希望大家可以多多思考,积极讨论,也希望大家可以指出我的问题,感谢大家阅读。
486

被折叠的 条评论
为什么被折叠?



