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

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

加法测试:


减法测试:


乘法测试:

相关推荐
akarinnnn几秒前
【DAY15】:深⼊理解指针(6)
算法
Lauren_Blueblue5 分钟前
第十六届蓝桥杯省赛Python研究生组-C变换数组
python·算法·蓝桥杯·编程基础
生信研究猿40 分钟前
leetcode 101.对称二叉树(不会做)
算法·leetcode·职场和发展
重生之我是Java开发战士41 分钟前
【笔试强训】Week1:点击消除,数组中两个字符串的最小距离,dd爱框框,腐烂的苹果,大数乘法
java·开发语言·算法
枫叶林FYL41 分钟前
【自然语言处理 NLP】前沿架构与多模态 选择性状态空间模型与并行扫描算法:从原理到实现
算法·自然语言处理·架构
WolfGang0073211 小时前
代码随想录算法训练营 Day29 | 动态规划 part02
算法·动态规划
样例过了就是过了1 小时前
LeetCode热题100 跳跃游戏 II
c++·算法·leetcode·贪心算法·动态规划
rit84324991 小时前
基于NSGA-II的多目标优化算法(MATLAB实现)
开发语言·算法·matlab
香蕉鼠片1 小时前
第三大的数
数据结构·算法·leetcode
汀、人工智能1 小时前
[特殊字符] 第28课:相交链表
数据结构·算法·链表·数据库架构··相交链表