为解决大整数的表示与运算溢出问题可以用把大整数先转换成二进制再把二进制中的每一位0 或 1以‘0’或‘1’字符的形式从低到高位依次存放到一个字符数组中称为大数的二进制字符数组表示。编程实现2个大整数的+、-与等基本运算。c语言带符号
的大数。
以下为c语言代码实现:
#include <stdio.h> #include <string.h>
#define MAXLEN 1000 //定义最大长度
typedef struct { char num[MAXLEN]; int len; } BigNum;
void init(BigNum *a) { //初始化 memset(a->num, 0, sizeof(a->num)); a->len = 0; }
void toBinary(char *s, BigNum *a) { //将大整数转换为二进制字符数组 int i, j = 0; char temp[MAXLEN]; init(a); scanf("%s", temp); a->len = strlen(temp); for(i = a->len - 1; i >= 0; i--) { int k = temp[i] - '0'; while(k > 0) { s[j++] = (k % 2) + '0'; k /= 2; } if(j < MAXLEN) s[j++] = '0'; } while(j < MAXLEN) s[j++] = '0'; for(i = 0; i < MAXLEN; i++) { a->num[i] = s[MAXLEN - i - 1]; } }
void print(BigNum a) { //输出二进制字符数组 int i; for(i = MAXLEN - a.len; i < MAXLEN; i++) { printf("%c", a.num[i]); } printf("\n"); }
void add(BigNum a, BigNum b, BigNum *c) { //相加 int i, t = 0; for(i = MAXLEN - 1; i >= 0; i--) { int x = a.num[i] - '0', y = b.num[i] - '0'; c->num[i] = (x + y + t) % 2 + '0'; t = (x + y + t) / 2; } c->len = MAXLEN; while(c->len > 1 && c->num[MAXLEN - c->len] == '0') c->len--; }
void sub(BigNum a, BigNum b, BigNum *c) { //相减 int i, t = 0; for(i = MAXLEN - 1; i >= 0; i--) { int x = a.num[i] - '0', y = b.num[i] - '0'; if(x - t >= y) { c->num[i] = x - y - t + '0'; t = 0; } else { c->num[i] = x + 2 - y - t + '0'; t = 1; } } c->len = MAXLEN; while(c->len > 1 && c->num[MAXLEN - c->len] == '0') c->len--; }
void mul(BigNum a, BigNum b, BigNum *c) { //相乘 int i, j, t = 0; BigNum temp; init(&temp); for(i = MAXLEN - 1; i >= MAXLEN - a.len; i--) { init(&temp); for(j = MAXLEN - 1; j >= MAXLEN - b.len; j--) { int x = a.num[i] - '0', y = b.num[j] - '0'; temp.num[i + j - MAXLEN + 1] = (x * y + t) % 2 + '0'; t = (x * y + t) / 2; } temp.num[i + j - MAXLEN + 1] = t + '0'; t = 0; temp.len = MAXLEN; while(temp.len > 1 && temp.num[MAXLEN - temp.len] == '0') temp.len--; add(*c, temp, c); } }
int main() { char s[MAXLEN]; BigNum a, b, c; init(&a); init(&b); init(&c); printf("请输入第一个大整数:"); toBinary(s, &a); printf("请输入第二个大整数:"); toBinary(s, &b); printf("二进制字符数组表示:\n"); printf("a = "); print(a); printf("b = "); print(b); printf("相加:\n"); add(a, b, &c); printf("a + b = "); print(c); printf("相减:\n"); sub(a, b, &c); printf("a - b = "); print(c); printf("相乘:\n"); mul(a, b, &c); printf("a * b = "); print(c); return 0;
原文地址: https://www.cveoy.top/t/topic/dHVt 著作权归作者所有。请勿转载和采集!