关于辗转相除法(欧几里得算法)| 递归与非递归
这个算法应该是比较简单的,while ,do……while,for等语句都可以实现,我这里用的是do……while。可能会有部分漏洞,希望各位大佬指出
非递归代码如下:
#include<stdio.h> int main(){ int a,b,c; printf("输入a,b的数值\n"); scanf("%d%d",&a,&b); if(a<b){//当a<b时,交换二者大小从而来取余 c=a; a=b; b=c; } do{ c=a%b; a=b; b=c; } while(c!=0); printf("最大公约数为%d\n",a);//注意这里要选择的是a,因为将要跳出循环时,b的值为0,此时a的值刚好是上一次循环b的值
这里是递归代码:
#include <stdio.h> int function(int a,int b){//定义函数 int c; if(a<b){ c=a; a=b; b=c; } if(a%b==0) return b; else return function(b,a%b);//采用递归,改变除数和被除数的变量 } int main(){//这里开始主函数 int a,b; printf("请输入两个数a,b\n"); scanf("%d%d",&a,&b); printf("最大公约数为%d",function(a,b)); }
ok,以上即是辗转相除法的个人见解,欢迎各位大佬指点!
人生如逆旅,我亦是行人