用c++写一个高精度的辗转相除法,用来帮我计算两个10000位以内整数的最大公约数
时间: 2023-01-31 10:57:00 浏览: 315
首先,我们需要定义一个结构体来存储高精度数据:
```c
#define MAX_LEN 10000 // 定义最大位数
typedef struct {
int num[MAX_LEN]; // 存储每一位数字
int len; // 当前数字的位数
} bignum;
```
然后,我们可以定义一个函数来计算两个高精度数的最大公约数:
```c
bignum gcd(bignum a, bignum b) {
bignum r;
while (b.len > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
```
其中,`%` 运算符是我们用来计算两个高精度数的取模运算的函数,它的实现方法如下:
```c
bignum operator%(bignum a, bignum b) {
bignum r;
r.len = a.len;
for (int i = a.len - 1; i >= 0; i--) {
for (int j = r.len - 1; j > 0; j--)
r.num[j] = r.num[j - 1];
r.num[0] = a.num[i];
while (r >= b) {
r = r - b;
}
}
while (r.len > 1 && r.num[r.len - 1] == 0)
r.len--;
return r;
}
```
这样,我们就可以使用辗转相除法来计算两个高精度数的最大公约数了。
最后,需要注意的是,我们还需要定义其他的运算符,比如 `-` 运算符用来计算两个高精度数的差,`>=` 运算符用来判断一个高精度数是否大于等于另一个高精度数等。
阅读全文