大数的加减法

计算机组成原理作业:

        用C语言实现大数的加减法

一、CODE 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int num1[1000];
int num2[1000];
int res[1000];//存储计算结果

//输入数据
void input_data(char* str1, char* str2);
//大数加法
void add(char* str1, char* str2);
//大数减法
void sub(char* str1, char* str2);

int main() {
	while (1) {
		printf("Enter the operation you want to perform.\n");
		printf("Addition	 -> 1\n");
		printf("Subtraction	 -> 2\n");
		printf("Exit program	 -> other\n\n");

		int operand = 0;
		printf("operand : ");
		scanf("%d", &operand);
		printf("\n");

		char str1[1000], str2[1000];
		switch (operand)
		{
		case 1: add(str1, str2); break;
		case 2: sub(str1, str2); break;
		default:
			exit(0);
		}
		printf("****************************************************\n\n\n");
	}
	return 0;
}

void input_data(char* str1, char* str2) {
	printf("Please enter a value for str1 : ");
	scanf("%s", str1);

	printf("Please enter a value for str2 : ");
	scanf("%s", str2);
	printf("\n");
}

void add(char* str1, char* str2) {
	input_data(str1, str2);

	int len1 = strlen(str1);
	int len2 = strlen(str2);

	int len = max(len1, len2);
	//数组初始化,即所有位赋 0
	memset(num1, 0, sizeof(num1));
	memset(num2, 0, sizeof(num2));
	memset(res, 0, sizeof(res));

	for (int i = 0; i < len1; i++) {
		num1[i] = str1[len1 - i - 1] - '0';
	}
	for (int i = 0; i < len2; i++) {
		num2[i] = str2[len2 - i - 1] - '0';
	}

	//carry 判断进位情况
	int carry = 0;
	for (int i = 0; i < len; i++) {
		res[i] = (num1[i] + num2[i] + carry) % 10;
		carry = (num1[i] + num2[i] + carry) / 10;
	}

	if (carry != 0) {
		res[len++] = 1;
	}

	printf("The result is : \n");
	printf("%s + %s = ", str1, str2);
	for (int i = len - 1; i >= 0; i--) {
		printf("%d", res[i]);
	}
	printf("\n");
}


void sub(char* str1, char* str2) {
	input_data(str1, str2);

	int len1 = strlen(str1);
	int len2 = strlen(str2);

	int len = max(len1, len2);
	//数组初始化,即所有位赋 0
	memset(num1, 0, sizeof(num1));
	memset(num2, 0, sizeof(num2));
	memset(res, 0, sizeof(res));

	for (int i = 0; i < len1; i++) {
		num1[i] = str1[len1 - i - 1] - '0';
	}
	for (int i = 0; i < len2; i++) {
		num2[i] = str2[len2 - i - 1] - '0';
	}

	//判断两个数字的大小
	// flag 的值为0,表示减数大于被减数,为1则反之
	int flag = 1;
	if (len1 < len2) {
		flag = 0;
	}
	else if (len1 == len2) {
		int i = 0;
		//从最高位找出最早不同的一位
		while (str1[i] == str2[i])
			i++;

		flag = str1[i] > str2[i] ? 1 : 0;
	}
	printf("flag = %d\n", flag);

	// borrow 用于判断借位情况
	int borrow = 0;
	if (flag) {
		for (int i = 0; i < len; i++) {
			res[i] = num1[i] - num2[i] - borrow;
			//借位
			if (res[i] < 0 && i + 1 < len) {
				borrow = 1;
				res[i] += 10;
			}
			else
				borrow = 0;
		}
	}
	else {
		for (int i = 0; i < len; i++) {
			res[i] = num2[i] - num1[i] - borrow;
			if (res[i] < 0 && i + 1 < len) {
				borrow = 1;
				res[i] += 10;
			}
			else
				borrow = 0;
		}
	}

	while (res[len - 1] == 0 && len > 1)
		len--;

	printf("The result is : \n");
	printf("%s - %s = ", str1, str2);
	if (!flag)
		printf("-");
	for (int i = len - 1; i >= 0; i--)
		printf("%d", res[i]);
	printf("\n");
}

二、测试

 ​​​​​​​

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值