知交

关于辗转相除法(欧几里得算法)| 递归与非递归

这个算法应该是比较简单的,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,以上即是辗转相除法的个人见解,欢迎各位大佬指点!

posted on 2020-11-26 22:24  知交  阅读(280)  评论(0编辑  收藏  举报

导航