C语言最大公约数求解办法及时间复杂度比较
— 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。最大公约数作为数学中常见的数学概念,在c语言中也可以用多种办法来求解。不同的办法理解难度和时间复杂度均不同。
以下我来介绍几种求最大公约数的方法:
1.暴力穷举法:
此方法是理解难度最低的办法,就是两个数从两个数字的较小者循环递减到1,看第一个满足两个数取余数皆为0的数字,并输出。
int num1=0;
int num2=0;
printf("请输入两个数字求最大公约数,用空格间隔:");
scanf("%d %d",&num1,&num2);
int min=num1;
if (num1>num2){
min=num2;
}//把最小的数字赋值给min
int time=0;//在循环中设置一个变量记录时间复杂度
for(int i=min;i>=1;i--){
time++;
if(num1%i==0 && num2%i==0){
printf("它们的最大公约数是:%d\n 时间复杂度是%d:\n",i,time);
//输出最大公约数和时间复杂度
break;
}
}
2.辗转相除法:
此方法也叫欧几里得算法,利用数学中的一个规则来求解。
两个数字相除取余,(num1%num2)第一个数字退出,第二个下一轮第一个,余数做第二个,一直循环。原理是基于两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。
(来源自百度百科)
我们可以用一个循环来表示该算法的辗转相除步骤。具体步骤如下:
int num1,num2;
printf("请输入两个数字求最大公约数,用空格间隔:");
scanf("%d %d",&num1,&num2);
int i=0;//余数
int time=0;//在循环中设置一个变量记录时间复杂度
while((i=num1%num2)!=0){
//注意括号的写法,运算符的优先级会影响结果
num1=num2;
num2=i;
time++;
}
printf("它们的最大公约数是:%d\n 时间复杂度是%d:\n",num2,time);
//输出最大公约数和时间复杂度
3.更相减损法:
更相减损法:也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。
输入两个数,用较大的减去较小的,余数赋值在进行相减,直到数字相同,为最大公约数。
具体的代码如下:
int num1, num2, time=0;//在循环中设置一个变量记录时间复杂度
printf("请输入两个数字求最大公约数,用空格间隔:");
scanf("%d %d", &num1, &num2);
while (num1 != num2){
if (num1>num2)
num1 = num1 - num2;
else
num2 = num2 - num1;
time++;
}
printf("它们的最大公约数是:%d\n 时间复杂度是%d:\n", num1, time);
以上三种方法都是比较简单好理解的办法,仅供参考。
时间复杂度上和具体的例子有关,但暴力穷举法是不推荐使用的(一般都很大…)