0
点赞
收藏
分享

微信扫一扫

大数的加减

芭芭蘑菇 2022-03-10 阅读 50

无小数无负数的大数加减

没仔细测过,不确定是不是完全正确

思路
加减操作都类似,把输入的字符串转化为整型的数组。然后把两个数组都倒过来。每一位分别相加减,然后处理进位和借位问题。得到的和差再倒过来输出。里面有些小坑必须自己动手去写代码才能感受到。

#include<stdio.h>
#include<string.h>
char s[100];
int num1[100] = { 0 }, num2[100] = { 0 }, sum[100] = { 0 }, dif[100] = { 0 };
void NumToArr(char *s, int* num);
void ReverseArr(char *s, int* num);
void Add(int* num1, int* num2);
void OutputTotal(int* sum);
int Cmp(int* num1, int* num2);
void Sub(int* num1, int* num2);
int main()
{
	scanf("%s", s);
	NumToArr(s, num1);
	ReverseArr(s,num1);
	scanf("%s", s);
	NumToArr(s, num2);
	ReverseArr(s,num2);
	Add(num1, num2);
	OutputTotal(sum);
	if (Cmp(num1, num2) == 1)
	{
		Sub(num1, num2);
		OutputTotal(dif);
	}
	else
	{
		Sub(num2, num1);
		//输出一个负号
		printf("-");
		OutputTotal(dif);
	}
	return 0;
}

//将字符数组转化为整型数组
void NumToArr(char *s, int* num)
{
	int k = 0;
	while (*(s) != '\0')
	{
		num[k++] = *s - '0';
		s++;
	}
}
//将数组倒序存放
void ReverseArr(char *s, int* num)
{
	int length = strlen(s);
	int temp = 0;
	for (int i = 0; i < length/2; i++)
	{
		temp = num[i];
		num[i] = num[length - 1 - i];
		num[length - 1 - i] = temp;
	}
}

void Add(int* num1, int* num2)
{
	printf("相加:");
	for (int i = 0; i < 100; i++)
	{
		sum[i] += num1[i] + num2[i];
		if (num1[i] + num2[i] >= 10)
		{
			sum[i + 1] += sum[i] / 10;
			sum[i]  = sum[i] % 10;

		}
	}
	
}
//输出,注意只能从后往前找最高为
void OutputTotal(int* sum)
{
	int i = 99;
	while (i > 0 && sum[i] == 0)
		i--;
	for (int j = i; j >= 0; j--)
	{
		printf("%d", sum[j]);
	}
	printf("\n");
}
//从最高位开始比较大小
int Cmp(int* num1, int* num2)
{
	for (int i = 99; i >= 0; i--)
	{
		if (num1[i] != 0 || num2[i] != 0)
		{
			if (num1[i] > num2[i])
				return 1;
			else
				return -1;
		}
	}
}

void Sub(int* num1, int* num2)
{
	printf("相减:");
	for (int i = 0; i < 100; i++)
	{
		dif[i] += num1[i] - num2[i];
		if (dif[i] < 0)
		{
			dif[i + 1]--;
			dif[i] = dif[i] + 10;
		}
	}
}

举报

相关推荐

0 条评论