个人实现大数加减乘(高精度加减乘)

题目参考**《"101计划"核心课程实践教材《数据结构实验指导 - C语言版》题目集》**第十九题。

个人测试无误,个人代码,个人考研记录,仅供参考算法思想


代码如下:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_INPUT_LENGTH 1005
#define PLUS 0
#define MINUS 1

void myreverse(char* lt) {
	if (!lt)
		return;

	int lt_length = strlen(lt);
	int loop_times = lt_length / 2;
	char temp;
	for (int i = 0; i < loop_times; ++i) {
		temp = lt[i];
		lt[i] = lt[lt_length - i - 1];
		lt[lt_length - i - 1] = temp;
	}
}

void stripfirst(char a[]) {
	int a_len = strlen(a);

	for (int i = 0; i < a_len - 1; ++i)
		a[i] = a[i + 1];

	a[a_len - 1] = 0;
}

void addfirst(char* answer, char sign) {
	if (!answer)
		return;

	int a_len = strlen(answer);

	if (a_len + 2 >= MAX_INPUT_LENGTH)
		return;

	for (int i = a_len; i > 0; --i)
		answer[i] = answer[i - 1];

	answer[a_len + 1] = '\0';
	answer[0] = sign;
}

int numcmp(char* a, char* b) {
	int a_len = strlen(a), b_len = strlen(b);

	if (a_len > b_len)
		return 1;

	else if (a_len < b_len)
		return 0;

	else
		return strcmp(a, b);
}

int getzero(char* answer) {
	int zero = 0, length = strlen(answer);

	for (int i = 0; i < length; ++i) {
		if (answer[i] != '0')
			break;

		++zero;
	}

	return zero;
}

char* myadd(char a[], char b[]) {
	char* answer = NULL;

	if (!(answer = (char*)malloc(sizeof(char) * (MAX_INPUT_LENGTH + 3)))) {
		puts("分配失败!");
		return NULL;
	}

	myreverse(a);
	myreverse(b);
	int a_len = strlen(a), b_len = strlen(b), max_len = (a_len > b_len) ? (a_len) : (b_len);
	int index, sum, carry = 0;
	char aa, bb;

	for (index = 0; index < max_len; ++index) {
		aa = (index < a_len) ? (a[index] - '0') : (0);
		bb = (index < b_len) ? (b[index] - '0') : (0);
		sum = aa + bb + carry;
		answer[index] = sum % 10 + '0';
		carry = sum / 10;
	}

	if (carry)
		answer[index++] = carry + '0';
	answer[index] = '\0';

	myreverse(answer);

	return answer;
}

char* mymulti(char a[], char b[]) {
	char* answer = NULL;

	if (!(answer = (char*)malloc(sizeof(char) * MAX_INPUT_LENGTH * 2))) {
		puts("分配失败!");
		return NULL;
	}

	myreverse(a);
	myreverse(b);

	int a_len = strlen(a), b_len = strlen(b);
	int* record = (int*)calloc(a_len + b_len, sizeof(int));

	if (!record) {
		puts("分配失败!");
		return NULL;
	}

	int temp;
	for (int i = 0; i < a_len; ++i) {
		temp = a[i] - '0';
		for (int j = 0; j < b_len; ++j)
			record[i + j] += (temp * (b[j] - '0'));
	}

	int max_len = a_len + b_len;
	int index, sum, carry = 0;
	for (index = 0; index < max_len; ++index) {
		sum = record[index] + carry;
		answer[index] = sum % 10 + '0';
		carry = sum / 10;
	}

	while (carry) {
		answer[index++] = carry % 10 + '0';
		carry /= 10;
	}
	answer[index] = '\0';

	myreverse(answer);

	free(record);

	char* temp_answer = NULL;
	int answer_length = strlen(answer);
	if (!(temp_answer = (char*)malloc(sizeof(char) * answer_length + 10))) {
		puts("分配失败!\n");
		return answer;
	}

	int zero_num = getzero(answer);

	int i;
	for (i = 0; i < answer_length - zero_num; ++i) {
		temp_answer[i] = answer[i + zero_num];
	}
	temp_answer[i] = '\0';

	free(answer);

	return temp_answer;
}

char* _myminus(char max[], char min[]) { //a > b
	char* answer = NULL;
	if (!(answer = (char*)malloc(sizeof(char) * MAX_INPUT_LENGTH))) {
		puts("分配失败!");
		return NULL;
	}

	myreverse(max);
	myreverse(min);

	int max_lt_len = strlen(max), min_lt_len = strlen(min);
	int max_length = (max_lt_len > min_lt_len) ? (max_lt_len) : (min_lt_len);

	int index, sum, lent = 0, aa, bb;
	for (index = 0; index < max_length; ++index) {
		aa = (index < max_lt_len) ? (max[index] - '0') : (0);
		bb = (index < min_lt_len) ? (min[index] - '0') : (0);
		sum = aa - bb - lent;

		lent = 0;
		if (sum < 0) {
			sum += 10;
			lent = 1;
		}

		answer[index] = sum % 10 + '0';
	}

	answer[index++] = '\0';

	myreverse(answer);

	return answer;
}

char* myminus(char a[], char b[]) {
	char* answer = NULL;

	char sign_a = (a[0] == '-') ? (MINUS) : (PLUS);
	char sign_b = (b[0] == '-') ? (MINUS) : (PLUS);

	int change_sign;
	char* temp = NULL;

	if (sign_a == PLUS && sign_b == PLUS) {
		answer = myadd(a, b);
	}
	else if (sign_a == MINUS && sign_b == MINUS) {
		stripfirst(a);
		stripfirst(b);
		answer = myadd(a, b);
		addfirst(answer, '-');
	}
	else if (sign_a == PLUS && sign_b == MINUS) {
		stripfirst(b);
		change_sign = 0;
		if (numcmp(a, b) < 0) {
			temp = a;
			a = b;
			b = temp;
			change_sign = 1;
		}
		answer = _myminus(a, b);

		if (change_sign)
			addfirst(answer, '-');
	}
	else if (sign_a == MINUS && sign_b == PLUS) {
		stripfirst(a);
		change_sign = 1;
		if (numcmp(a, b) < 0) {
			temp = a;
			a = b;
			b = a;
			change_sign = 0;
		}
		answer = _myminus(a, b);

		if (change_sign)
			addfirst(answer, '-');
	}

	char* temp_answer = NULL;
	int answer_length = strlen(answer);
	int zero = getzero(answer);

	if (zero) {
		if (!(temp_answer = (char*)malloc(sizeof(char) * (answer_length + 10)))) {
			puts("分配失败!");
			return answer;
		}

		int i;
		for (i = 0; i < answer_length - zero; ++i)
			temp_answer[i] = answer[i + zero];

		temp_answer[i] = '\0';

		free(answer);
		return temp_answer;
	}

	return answer;
}

int main() {
	char a[MAX_INPUT_LENGTH], b[MAX_INPUT_LENGTH];
	puts("请输入两行数字: (负数需要带符号)");
	scanf("%s", a);
	scanf("%s", b);

	char* answer = NULL;
	int option;
	puts("请输入操作符: (1加 2减 3乘)");
	scanf("%d", &option);

	switch (option) {
	case 1:
		answer = myadd(a, b);
		break;
	case 2:
		answer = myminus(a, b);
		break;
	case 3:
		answer = mymulti(a, b);
		break;
	default:
		break;
	}

	if (!answer)
		return 1;

	printf("答案:%s\n", answer);

	free(answer);
	return 0;
}

加法测试:


减法测试:


乘法测试:

相关推荐
吃好睡好便好2 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅2 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue4 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路5 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星5 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑5 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光6 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩6 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_629494737 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
ʚ希希ɞ ྀ8 小时前
单词拆分----dp
算法