首先这个算法的要求是:两个一百位以内的大数相加输出结果,两个数长短不确定。
那么什么样的数字是大数呢? 所谓的大数其实就是一个无限大的数字,他的位数没有限制;int,long型都装不下的数字,所以在这我们自然就考虑到用字符串或是字符数组的形式来存取数的每个数字,对两个大数的每个数字来进行加法运算,结果大于9的就进位。
废话不多说,下面是这个算法的解决:
#include <stdio.h>
#include <string.h>
#define N 100 //因为题目要求是一个一百位内的大数相加,所以我们宏定义一个N为100
//大数相加的函数
void Bigdata(char *s1, char*s2)
{
//这里前两个为待计算的大数,将计算结果的每个数字存在num数组中,至于为什么都将3个数组中每个元素初始化为0,后面解释。
int num1[N] = {0}, num2[N] = {0}, num[N+1] = {0};//因为存在进位所以存放结果的数组大小可能会超过百位
int len1 = strlen(s1);//分别求出两个字符数组的大小,即所含字符数字的个数
int len2 = strlen(s2);
int i;
//将两个大数倒置存放到num1和num2数组中,倒置原因是我们希望数字的前面存放数字的低位,我们从索引为0开始即从个位相加往前进位。
for(i = 0; i < len1; i++)
num1[i] = s1[len1-i-1] - '0';// -'0'是为了将字符数组转为整型数字
for(i = 0; i < len2; i++)
num2[i] = s2[len2-i-1] - '0';
//两个数字位数不同,取位数长的数字的大小给len
int len = len1 > len2 ? len1: len2;
for(i = 0; i < len; i++) {
//这里将每位相加送到num对应的数组中,用+=,不用=的原因是若有进位还有加上进位的1,进位处理在下if代码段中
num[i] += num1[i]+num2[i];
if(num[i] > 9) {//如产生进位
num[i] %= 10;//取个位
num[i+1]++;//因为之前初始化都为0,所以在未赋值前num中的数都为0,这里将索引后一位(即是数字中的前一位比如9+1=10其中1和0分别存在num[1],num[0]的位置)自加1表示进位。
}
}
if(num[len] != 0)//如果发生进位,最高位输出,最高位也一定是1
printf("%d", num[len]);
for(i = len-1; i >= 0; i--)
printf("%d", num[i]);//倒置输出,从高位输出。
}
int main()
{
char str1[N];
char str2[N];
printf("请分别输入两个大数:\n");//输入两个字符数组
scanf("%s %s", str1, str2);
Bigdata(str1, str2);//最终得出结果
return 0;
}
如果你有更好的方法,欢迎留言交流。