c语言 高精度加法(有负数)
时间: 2023-10-16 14:31:55 浏览: 129
这里提供一种高精度加法的实现方式,可以处理负数。
首先,我们需要定义一个结构体来表示大整数:
```c
typedef struct {
int len; // 数字的位数
int sgn; // 符号,1表示正数,-1表示负数
int num[MAX_LEN]; // 数字数组
} BigInt;
```
其中,`len`表示数字的位数,`sgn`表示符号,`1`表示正数,`-1`表示负数,`num`是一个长度为`MAX_LEN`的数组,用来存储数字。
接下来,我们可以定义一个函数来将字符串转换成大整数:
```c
void str_to_bigint(char* str, BigInt* n) {
int i, j;
if (str[0] == '-') {
n->sgn = -1;
i = 1;
} else {
n->sgn = 1;
i = 0;
}
n->len = strlen(str) - i;
for (j = 0; j < n->len; j++) {
n->num[j] = str[n->len - j - 1 + i] - '0';
}
// 去掉前导零
while (n->len > 1 && n->num[n->len - 1] == 0) {
n->len--;
}
}
```
这个函数会将字符串`str`转换成大整数`n`。如果字符串的第一个字符是`-`,则`n`表示负数,否则表示正数。这个函数会自动去掉数字前面的前导零。
接下来,我们可以定义一个函数来将大整数转换成字符串:
```c
void bigint_to_str(BigInt* n, char* str) {
int i;
if (n->sgn == -1) {
str[0] = '-';
i = 1;
} else {
i = 0;
}
for (int j = n->len - 1; j >= 0; j--) {
str[i++] = n->num[j] + '0';
}
str[i] = '\0';
}
```
这个函数会将大整数`n`转换成字符串`str`。如果`n`表示负数,则字符串的第一个字符是`-`。
接下来,我们可以定义一个函数来实现高精度加法:
```c
void bigint_add(BigInt* a, BigInt* b, BigInt* c) {
int i, carry = 0;
if (a->sgn == b->sgn) {
c->sgn = a->sgn;
c->len = max(a->len, b->len);
for (i = 0; i < c->len; i++) {
c->num[i] = a->num[i] + b->num[i] + carry;
carry = c->num[i] / 10;
c->num[i] %= 10;
}
if (carry) {
c->num[c->len++] = carry;
}
} else {
// a和b的符号不同,转化为减法
BigInt d;
d.sgn = -b->sgn;
d.len = b->len;
for (i = 0; i < d.len; i++) {
d.num[i] = b->num[i];
}
// 递归调用减法
bigint_sub(a, &d, c);
}
// 去掉前导零
while (c->len > 1 && c->num[c->len - 1] == 0) {
c->len--;
}
}
```
这个函数会将两个大整数`a`和`b`相加,结果存储到`c`中。如果`a`和`b`的符号相同,则直接将它们的数字相加即可;否则,将问题转化为减法。
最后,我们可以定义一个`main`函数来测试:
```c
int main() {
char str1[MAX_LEN], str2[MAX_LEN];
BigInt a, b, c;
scanf("%s%s", str1, str2);
str_to_bigint(str1, &a);
str_to_bigint(str2, &b);
bigint_add(&a, &b, &c);
char str[MAX_LEN];
bigint_to_str(&c, str);
printf("%s\n", str);
return 0;
}
```
输入两个字符串表示的大整数,将它们转换成`BigInt`类型,然后调用`bigint_add`函数计算它们的和,最后将结果转换成字符串输出。
阅读全文