用c语言写欧几里德算法
时间: 2023-03-27 09:03:17 浏览: 271
欧几里德算法可以用C语言实现,代码如下:
```c
#include <stdio.h>
int gcd(int a, int b) {
if (b == ) {
return a;
}
return gcd(b, a % b);
}
int main() {
int a, b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
printf("它们的最大公约数是:%d\n", gcd(a, b));
return ;
}
```
这个程序可以计算两个整数的最大公约数,使用递归实现欧几里德算法。
相关问题
C语言扩展欧几里德算法求模逆元
扩展欧几里德算法可以用来求解模线性方程,其中就包括求解模逆元的问题。假设我们需要求解 a 在模 m 意义下的逆元 x,即 ax ≡ 1 (mod m),那么就可以使用扩展欧几里德算法来求解。
具体步骤如下:
1. 用欧几里得算法求出 a 和 m 的最大公约数 gcd(a, m),如果 gcd(a, m) 不等于1,则 a 在模 m 意义下没有逆元。
2. 使用扩展欧几里德算法求出 ax + my = gcd(a, m) 的一组整数解 (x, y)。
3. 如果 gcd(a, m) 等于1,则 ax ≡ 1 (mod m) 的一个解就是 x,但是 x 可能为负数或者大于等于 m,因此需要对 x 做一些调整,使得 x 在 [0, m) 范围内。
以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
// 扩展欧几里德算法求解 ax + my = gcd(a, m) 的一组整数解 (x, y)
int exgcd(int a, int b, int *x, int *y) {
if (b == 0) {
*x = 1;
*y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
*y -= a / b * (*x);
return d;
}
// 求解模逆元 ax ≡ 1 (mod m)
int mod_inv(int a, int m) {
int x, y;
int d = exgcd(a, m, &x, &y);
if (d != 1) {
printf("%d 在模 %d 意义下没有逆元\n", a, m);
return -1;
}
return (x % m + m) % m;
}
int main() {
int a = 3, m = 11;
int x = mod_inv(a, m);
if (x != -1) {
printf("%d 在模 %d 意义下的逆元是 %d\n", a, m, x);
}
return 0;
}
```
上面的代码中,exgcd 函数用于求解 ax + my = gcd(a, m) 的一组整数解 (x, y)。如果 gcd(a, m) 不等于1,则表示 a 在模 m 意义下没有逆元,此时 mod_inv 函数返回 -1。否则,mod_inv 函数返回 x 的值,表示 a 在模 m 意义下的逆元。注意,最后需要对 x 做一些调整,使得 x 在 [0, m) 范围内。
C语言用欧几里德算法do-while求两个正整数最大公约数
在C语言中,我们可以使用欧几里得算法(也称为辗转相除法)结合do-while循环来计算两个正整数的最大公约数(GCD)。这个算法的基本思想是利用a除以b的余数,如果余数为0,则b就是最大公约数;否则将b赋值给a,原来的b赋值给余数,继续迭代,直到余数为0。
以下是使用do-while实现欧几里得算法的C语言代码示例:
```c
#include <stdio.h>
int gcd(int a, int b) {
int temp; // 临时变量
do {
if (a % b == 0) { // 如果a能被b整除,b即为最大公约数
return b;
} else { // 否则交换a和b,然后继续取模操作
temp = a; // 将a赋值给temp
a = b; // 更新a为b
b = temp % b; // 更新b为a除以b的余数
}
} while (b != 0);
}
int main() {
int num1, num2;
printf("请输入两个正整数:");
scanf("%d %d", &num1, &num2);
int result = gcd(num1, num2);
printf("这两个数的最大公约数是:%d\n", result);
return 0;
}
```
在这个程序中,用户输入两个正整数,然后调用`gcd`函数计算它们的最大公约数,并打印结果。
阅读全文