枚举法求解最大公约数
-
算法思路
- 枚举
1、要求随意给定任意两个数值,计算最大公约数,这时就产生了给定数值大小的问题即:终止条件问题。枚举的意思是:通过列举不同的数值看是否满足同时可以被给定两个数整除的条件,如果满足则存储,最后比较其中最大值输出。
- 枚举
-
代码如下:
//枚举法求解最大公约数
#include<stdio.h>
int main()
{
int a,b;
int i;
int min;
int gcd;
printf("请输入俩个数(中间空格):") ;
scanf("%d %d:",&a,&b);
if(a<b){
min=a;
}
else min = b;
for(i=1;i<=min;i++){
if(a%i==0){
if(b%i==0){
gcd=i;
}
}
}
printf("%d",gcd);
return 0;
}
代码输出:
请输入俩个数(中间空格):12 72
12
--------------------------------
Process exited after 13.55 seconds with return value 0
请按任意键继续. . .
代码分析:
代码刚开始用于判定输入值的大小引入了变量 min ;min 变量的意义在于控制枚举法中循环条件,类似于抽硬币程序中的多层判断,不过这个程序只要求一个结果,所以不要多重循环。
辗转相除法求解最大公约数
- 算法思路
-
辗转相除法
这里算法思路主要是辗转相除法也称欧几里得算法。
- 代码如下:
//辗转相除法计算两个数的公约数
#include<stdio.h>
int main()
{
int a,b;
int t;
scanf("%d %d",&a,&b);
while(b!=0){
t=a%b;
a=b;
b=t;
printf("a=%d,b=%d,t=%d\n",a,b,t);
}
printf("gcd=%d\n",a);
return 0;
}
输出结果:
12 18
a=18,b=12,t=12
a=12,b=6,t=6
a=6,b=0,t=0
gcd=6
--------------------------------
Process exited after 3.187 seconds with return value 0
请按任意键继续. .
代码分析:与枚举法相比,辗转相除法可以大大提高代码的执行效率。
辗转相除法
简介:
欧几里德算法是用来求两个正整数最大公约数的算法。是由古希腊数学家欧几里德在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里德算法,扩展欧几里德算法可用于RSA加密等领域。
其计算原理依赖于下面的定理:定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。
辗转相除法