思路:(不考虑输入非法的情况)
超大数无法使用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;
}