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

题目参考**《"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;
}

加法测试:


减法测试:


乘法测试:

相关推荐
郭逍遥1 小时前
[Godot] 通过AABB包围盒和射线法检测碰撞
算法·游戏引擎·godot
大黄说说1 小时前
解锁 .NET 性能极限:深入解析 Span 与零拷贝内存艺术
java·数据结构·算法
知识即是力量ol1 小时前
深入理解 Snowflake 雪花算法:原理、本质、趋势递增问题与分布式顺序困境全解析
java·分布式·算法·雪花算法·snowflake·全局唯一id·分布式id生成器
啊阿狸不会拉杆1 小时前
《计算机视觉:模型、学习和推理》第 11 章-链式模型和树模型
人工智能·学习·算法·机器学习·计算机视觉·hmm·链式模型
二年级程序员2 小时前
一篇文章掌握“树”(上)
c语言·数据结构·算法
薛定e的猫咪2 小时前
【Bayesian Analysis 2023】大数据背景下的分布式贝叶斯模型选择
大数据·分布式·算法·数学建模
菜鸡儿齐2 小时前
leetcode-搜索二维矩阵
算法·leetcode·矩阵
hans汉斯2 小时前
《数据挖掘》期刊推介&征稿指南
图像处理·人工智能·算法·yolo·数据挖掘·超分辨率重建·汉斯出版社
炽烈小老头2 小时前
【每天学习一点算法 2026/02/24】矩阵置零
学习·算法·矩阵