C语言实现超大数相加

思路:(不考虑输入非法的情况)

    超大数无法使用char、int、float、double进行数据保存,所以使用数组进行数据保存,且数据为ascii码的形式

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

#define MAX 256
#define CARRY_FLAG ('9' + 1)

/*
* 将输入的大数存放起来
* */
void InputBigNumber(char *BigNumberString)
{
	char inputChar = 0;
	int i = 0;
	while ((inputChar = getchar()) != '\n' && i < MAX)
	{
		*(BigNumberString++) = inputChar;
		i++;
	}
}

/*
* 打印计算的求和结果
* */
void BigNumberPrint(char *result, int result_len)
{
	int i = 0;
	while (i < result_len)
	{
		if (i == 0)
		{
			if (*(result + i) != '1')
			{
				i++;
				continue;
			}
		}
		printf("%d", *(result + i) - '0');
		i++;
	}
	printf("\n");
}

/*
* 进行两个大数的加法运算,并对加过进行存储
* */
void BigNumberSum(char *BigNumberString1, int len1, char *BigNumberString2, int len2, char *result)
{
	int c = 0;
	int flag = 0;
	c = len1 > len2 ? len1 : len2;
	len1--;
	len2--;
	while (len1 >= 0 || len2 >= 0)
	{
		if (len1 < 0)
		{
			*(BigNumberString1 + len1) = '0';
		}
		if (len2 < 0)
		{
			*(BigNumberString2 + len2) = '0';
		}
		*(result + c) = (*(BigNumberString1 + len1) - '0') + (*(BigNumberString2 + len2) - '0') + '0' + flag;
		if (*(result + c) >= CARRY_FLAG)
		{
			*(result + c) = *(result + c) - CARRY_FLAG + '0';
			flag = 1;
		}
		else
		{
			flag = 0;
		}
		len1--;
		len2--;
		c--;
	}
	if (flag == 1)
	{
		*(result + c) = '1';
	}
	else
	{
		*(result + c) = '2';
	}
}

int main(int argc, char const *argv[])
{
	char BigNumberString1[MAX] = { 0 };
	char BigNumberString2[MAX] = { 0 };
	char result[MAX + 1] = { 0 };
	int BigNumberString1_len1 = 0;
	int BigNumberString2_len2 = 0;
	int result_len = 0;
	printf("请输入第一个数:");
	InputBigNumber(BigNumberString1);
	printf("请输入第二个数:");
	InputBigNumber(BigNumberString2);
	BigNumberString1_len1 = strlen(BigNumberString1);
	BigNumberString2_len2 = strlen(BigNumberString2);
	BigNumberSum(BigNumberString1, BigNumberString1_len1, BigNumberString2, BigNumberString2_len2, result);
	result_len = strlen(result);
	BigNumberPrint(result, result_len);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/poetry_and_distance/article/details/80920213
今日推荐