因为计算机计算的数值位数有限,当要算两个几百位,几千位或者更大位数的加法时,直接输入不能再进行计算,所以要编写程序来模拟加法的运算过程,这样不管多少位的加法问题,都可以计算出来。
基本思路,输入的时候两个数都是以字符串的形式输入的,测出每个字符串的长度(也就是该数的位数),因为字符串不能直接进行运算,所以测出长度之后将字符串形的数反向转化为整形数组的形式(例如输入两个数为100和10,转化为整形数组形式储存为001和01,让低位在前,是运算更方便),然后进行运算。
要用到两个字符型数组来先保存输入的数,再定义3个整形数组,要将这三个数组中的元素开始的时候全部清零,其中两个来储存将字符型数转化过的整型数,再有一个就是来保存运算结果的数组。
运算过程如下图:
程序(多组测试的):
#include<bits/stdc++.h>
using namespace std;
int main()
{
inta1[1004],b1[1004],c[1004],t1,t2,t,i,k,n;
char a2[1004],b2[1004]; 这两个数组用来输入两个数;
cin>>n;
while(n--) n组测试;
{
int j1=0,j2=0; 转化类型时候j1来当a1的下标,j2来当a2的下标;
cin>>a2;
cin>>b2;
t1=strlen(a2); 测出两个字符串的长度;
t2=strlen(b2);
memset(c,0,sizeof(c)); 将三个整型数组中的所有元素清零;
memset(a1,0,sizeof(a1));
memset(b1,0,sizeof(b1));
for(i=t1-1;i>=0;i--) 将第一个字符串转化为整型数,保存在a1中;
a1[j1++]=a2[i]-'0';
for(i=t2-1;i>=0;i--) 将第二个字符串转化为整型数,保存在a2中;
b1[j2++]=b2[i]-'0';
t=max(t1,t2);
for(i=0;i<t;i++) 将两个数组的数进行加法运算;
c[i]=a1[i]+b1[i];
for(i=0;i<t;i++)
{
if(c[i]>=10) 上面的运算数组中的数可能大于10;
{
c[i+1]+=c[i]/10; 取整进位;
c[i]=c[i]%10; 原位取余保存;
}
}
运算结果可能会比输入的数位数多一位,所以下面要判断结果是否多出了一位;
if(c[t]==0) 判断下标为t的这一位就是看是否为多出一位,因为输入的数的最大长度为t。存储用到的最大下标为t-1;如果该位为0,则没有多出一位;
{
for(i=t-1;i>=0;i--) 从t-1输出就行;
cout<<c[i];
}
else if(c[t]!=0) 如果该位不为0,则结果多了一位;
{
for(i=t;i>=0;i--) 从t输出。
cout<<c[i];
}
cout<<endl;
}
return 0;
}