在c语言中,有以下一类问题
给定两个数,求出其最大公因数;例:20 40 ;答:20;
方法:辗转相除法:
例子:24 18:24%18=1.。。。。6
18%6=3.。。。。0
此时6就为其最大公因数
换一种说法:a,b,先拿a/b=k。。。c(其中c不等于0)
在拿b/c=j。。。。i,若i等于0,则c为最大公因数;意思就是先拿a/b得到余数n,拿除数b除以余数n,若余数n+1为0,则n为最大公约数。代码如下
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;//余数
scanf("%d %d",&a,&b);
c = a % b;//注意,c一定要放在输入数字之后,然后在循环内部更新;
while(c!=0)
{
a = b;
b = c;
c =a % b;
}
printf("%d",b);
return 0;
}
更为严谨的做法,在scanf与c的定义间插入以下代码
// 确保b不为0,否则后续操作将是不安全的
if (b == 0) {
printf("Error: Division by zero.\n");
return 1; // 返回一个非零值表示错误
}
若是三个数求最大公因数呢,可通过设定函数减少计算量:
#include <stdio.h>
// 函数用于计算两个数的最大公因数
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main() {
int num1, num2, num3, result;
// 读取用户输入的三个整数
printf("请输入三个整数(用空格分隔): ");
scanf("%d %d %d", &num1, &num2, &num3);
// 首先计算前两个数的最大公因数
result = gcd(num1, num2);
// 然后将结果与第三个数再次应用欧几里得算法
result = gcd(result, num3);
// 输出三个数的最大公因数
printf("三个数的最大公因数是: %d\n", result);
return 0;
}
tips:交换两个数的值,可以通过设置第三个变量来实现:
就像a b两碗水,只要拿出c这个空碗,将a水倒入c中,b水倒入a中,c水倒入b中,就完成了a,b两水的交换。