栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

大数的加减法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

大数的加减法

计算机组成原理作业:

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

一、CODE 
#include 
#include 
#include 
#include 

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	 -> 1n");
		printf("Subtraction	 -> 2n");
		printf("Exit program	 -> othernn");

		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("****************************************************nnn");
	}
	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 = %dn", 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");
}
二、测试

 ​​​​​​​

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号