引言:
在我们学习了加法运算之后,了解了int型最大可以表示到2的32次方,但是若要计算更大的数呢??
解法:
我们利用string来储存数字,string可以存放很多字符,而每一个数字都有对应的ASCII值,如下图
对照码表,假如我的字符中某个字符为1,他的实际的值是49(对照ASCII表)。所以想要得到真正的数值就可以让
当前位数对应的值=数字在码表中对应的值-48。
在过程中还需要考虑到进位的问题,可以通过两个数对应的位数字相加得到的数字判断是否大于10,如果大于10,就当前位数的数字等于除10的余数,再记录进位的数值,我让他为flag(如果大于10,flag=1;小于10,flag=0
比如:18+9 结果是个位的值变成(8+9)%10=7 ,并且要进位,所以flag=1;再比如11+12 个位值是1+2=3
不用进位,所以flag=0;
还需要考虑到的是,如果是99+2这样的数时,答案101是三位数,可是99是两位数,循环次数(不懂这句话可以先看代码)和最长位数相等,这里是2次,不会再往下进行,输出结果实际是01,要怎么办?
此时可以引入头文件string,使用Insert(插入)函数,将进位1插入到第一位中,就得到答案101了。
#include<iostream>
#include<string>
using namespace std;
void exchange(string& n1, string& n2)//我让n1是比较长的那个,如果不满足就交换他们
{
string t;
if (n1.length() < n2.length())
{
t = n1;
n1 = n2;
n2 = t;
}
}
void Addnumber(string &n1, string n2)//最后加得的值我返回到n1上,这就是为什么我要交换的原因
{
int aLen =n1.length(), bLen = n2.length(), a, b, flag = 0, sum;
while (aLen > 0) //直到最大位数n1[0],即第一个字符(最大位数)的位置
{
a = n1[aLen - 1]-48;//这个位数的数字加上一个位数的十位值,若无,则flag=0;
if (bLen > 0)
b = n2[bLen - 1]-48;
else
{
b = 0; //如果此时b位数不存在,即此位为0
}
sum = a + b + flag; //相同位的数字相加
flag = 0; //使用过后初始化
if (sum >= 10) //大于10需要进位
{
n1[aLen - 1] = sum % 10+48;
flag = 1; //大一位的数字需要加1
}
else
n1[aLen - 1] = sum+48;
aLen--;
bLen--;
}
if (flag == 1)
n1.insert(0, "1");
}
int main()
{
string n1, n2;
cin >> n1;
cin >> n2;
exchange(n1, n2);
Addnumber(n1, n2);
cout << n1 << endl;
}