C语言实现大整数运算:加减模运算
C语言实现大整数运算:加减模运算
为了解决大整数的表示与运算溢出问题,我们可以将大整数先转换成二进制,再把二进制中的每一位,0 或 1,以'0'或'1'字符的形式,从低到高位依次存放到一个字符数组中,称为大数的二进制字符数组表示。
本文将使用C语言实现两个大整数的+、-与%等基本运算。
代码实现
/* 大整数加法 */
void add(char A[], char B[], char C[]) {
int len1 = strlen(A), len2 = strlen(B);
int len = max(len1, len2);
int carry = 0; // 进位标志
for (int i = 0; i < len; i++) {
int a = i < len1 ? A[len1 - 1 - i] - '0' : 0;
int b = i < len2 ? B[len2 - 1 - i] - '0' : 0;
int sum = a + b + carry;
C[len - 1 - i] = sum % 10 + '0';
carry = sum / 10;
}
if (carry) C[0] = '1'; // 如果最高位有进位,需要在最高位加1
}
/* 大整数减法 */
int cmp(char A[], char B[]) {
int len1 = strlen(A), len2 = strlen(B);
if (len1 != len2) return len1 > len2 ? 1 : -1;
for (int i = 0; i < len1; i++) {
if (A[i] != B[i]) return A[i] > B[i] ? 1 : -1;
}
return 0;
}
void sub(char A[], char B[], char C[]) {
int len1 = strlen(A), len2 = strlen(B);
int len = max(len1, len2);
if (cmp(A, B) < 0) { // 如果被减数小于减数,交换两者
swap(A, B);
putchar('-');
}
int borrow = 0; // 借位标志
for (int i = 0; i < len; i++) {
int a = i < len1 ? A[len1 - 1 - i] - '0' : 0;
int b = i < len2 ? B[len2 - 1 - i] - '0' : 0;
int diff = a - b - borrow;
if (diff < 0) { // 如果需要借位
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
C[len - 1 - i] = diff + '0';
}
while (len > 1 && C[0] == '0') len--; // 去掉前导零
C[len] = '�';
}
/* 大整数取模 */
int mod(char A[], int b) {
int res = 0; // 余数
int len = strlen(A);
for (int i = 0; i < len; i++) {
res = res * 10 + A[i] - '0';
res %= b;
}
return res;
}
代码解析
-
大整数加法
add()函数- 该函数实现两个大整数的加法运算,并存储在
C数组中。 - 使用
carry变量记录进位,从低位到高位进行逐位相加。 - 若最高位有进位,则需要在最高位加 1。
- 该函数实现两个大整数的加法运算,并存储在
-
大整数减法
sub()函数- 该函数实现两个大整数的减法运算,并存储在
C数组中。 - 首先使用
cmp()函数比较两个大整数的大小,若被减数小于减数,则交换两者并输出负号。 - 使用
borrow变量记录借位,从低位到高位进行逐位相减。 - 若需要借位,则当前位加 10,并将借位标志设为 1。
- 最后,去除前导零。
- 该函数实现两个大整数的减法运算,并存储在
-
大整数取模
mod()函数- 该函数实现大整数对一个整数的取模运算。
- 使用
res变量记录余数,从低位到高位进行逐位计算。 - 每次计算将当前位的值加入到
res中,并对b取模。
总结
本文介绍了使用C语言实现大整数加减模运算的方法,通过将大整数转换为二进制字符数组,避免了整数溢出问题,并提供了详细的代码实现和注释。
注意: 上述代码仅供参考,具体的实现方式可能需要根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/nJ31 著作权归作者所有。请勿转载和采集!