C++高精度加法

我们以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;
}

大家自己把这道题做一下,下篇文章讲高精度减法,再见!

你可能感兴趣的:(C++,c++,开发语言,算法)