我们以957+59为例,来感受一下高精度加法
数学解题方法:
9 5 7
+ 5 9
——————————
1 0 1 6
但我们为什么要做高精度运算?
我们看一张表:
名称 | 含义 | 范围 |
char | 字符型 | -128~127 |
short | 短整型 | -2^15~2^15-1 |
int | 整型 | -2^31~2^31-1 |
long long | 长整型 | -2^63~2^63-1 |
float | 实型 | 10^38 |
double | 浮点型 | 10^308 |
但就算是long long类型,也只能存十九位数如果有两个200位的整数需要进行加法,那么就需要用到高精度加法进行求解
但是如果从右向左计算就太麻烦了,所以我们把他反过来计算,然后逐位进位,最后逆序输出结果
对了,我们做了好几道题了,你们可能都不知道做题网站,现在记一下:
oj.czos.cn
好,现在我们来看一下编号为1268的这道题:
1268 - 高精度加法-东方博宜OJ
由于有240位数,所以我们用string读入两个数,然后再逆序赋值给a数组和b数组,相加的和存入c数组,最后逆序输出结果
那a数组和b数组要定义多大空间呢?题目说一共有240位的整数,我们以防万一,我们把空间定义的大一点,定义250个空间
那么c数组又要定义多大空间呢?有人说:“240位加240位等于480位!”,这样的话数学就白了,我们可以举一个例子:
最大的两位数是99,99+99=198,是一个三位数,所以240位加240位最多等于241位,当然我们可以把数组定义的大一点,以防自己的判断失误,也不是没有这种可能,所以我们定义c数组定义500个空间
我们来看一下赋值的代码:
#include
using namespace std;
int a[250], b[250], c[500];
int main(){
string s1, s2;
cin >> s1 >> s2;
for(int i = 0; i < s1.size(); i++)
a[s1.size() - i - 1] = s1[i] - '0';
for(int i = 0; i < s2.size(); i++)
b[s2.size() - i - 1] = s2[i] - '0';
return 0;
}
我们之前讲过,字符串赋值给赋的ASCII码,就是字符‘0’的ASCII码也是48,所以我们要减去字符‘0’,减48也可以,因为字符‘0’对应的ASCII码就是48
我们现在再来看一下相加的代码:
#include
using namespace std;
int main(){
int len = max(s1.size(), s2.size());
for(int i = 0; i < len; i++)
{
c[i] = a[i] + b[i];
}
return 0;
}
我这里就没再额外定义a、b、c三个数组了
len等于s1和s2里面最长的那个,然后循环len次
下面是进位的代码:
#include
using namespace std;
int main(){
for(int i = 0; i < len; i++)
{
if(c[i] >= 10)
{
c[i + 1] += 1;
c[i] %= 10;
}
}
return 0;
}
为什么一定是加一呢?因为就算最大也是9+9=18,所以最多进1
那么,问题来了:我们如何判断结果有没有多一位呢?答案很简单,由于我们最开始定义的都是全局数组,都会自动赋值为0,由于我们的下标是从0开始,所以我们只需要看c[len]是否等于0就可以了,如果不是0,len就加一,然后循环len次,逆序输出
代码:
#include
using namespace std;
int main(){
if(c[len] != 0)
len += 1;
return 0;
}
最后逆序输出,i赋初值等于len-1,因为下标是从0开始,一直到len-1,然后循环条件是i>=0,注意了,必须是i--才行
代码:
#include
using namespace std;
int main(){
for(int i = len - 1; i >= 0; i--)
cout << c[i];
return 0;
}
最后只需要把这几段代码相结合,就可以做出这道题了
代码:
#include
using namespace std;
int a[250], b[250], c[500];
int main(){
string s1, s2;
cin >> s1 >> s2;
for(int i = 0; i < s1.size(); i++)
a[s1.size() - i - 1] = s1[i] - '0';
for(int i = 0; i < s2.size(); i++)
b[s2.size() - i - 1] = s2[i] - '0';
int len = max(s1.size(), s2.size());
for(int i = 0; i < len; i++)
{
c[i] = a[i] + b[i];
}
for(int i = 0; i < len; i++)
{
if(c[i] >= 10)
{
c[i + 1] += 1;
c[i] %= 10;
}
}
if(c[len] != 0)
len += 1;
for(int i = len - 1; i >= 0; i--)
cout << c[i];
return 0;
}
大家自己把这道题做一下,下篇文章讲高精度减法,再见!