说明:
高精度可以说除了排序算法以外接触到的第一个算法了,反正我是这样的,高精度主要是用在c/c++,因为Python 是默认无限大的,所以不需要用高精度,JAVA是有库可以调用也是不需要用高精度,其他语言要不要我就不知道了,我也没涉及那么多语言。但是C/C++就不行了,最大也就是unsigned long long也就才(1e19+8e18)位如果要几百位的相加减就不行了,所以就要用高精度了,但高精度是什么呢,一句话,就是处理很大的数相加减之类就比如几百位的数相加,就是很大的数。
一、高精度加法
高精度加法就是完全模拟小学的加法运算,我们先看下小学的加法运算就用123 + 789
1 | 2 | 3 | |
---|---|---|---|
+ | 7 | 8 | 9 |
9 | 1 | 2 |
没毛病吧,我们就完全可以按照这个来模拟,都知道是从个位数开始加,好的,那我们开始加,也就是 3 + 9 == 12 所以就要进1位余2,然后就是2 + 8 == 10,进1 余0 但是要加上之前进的1位就变成1对吧,然后就是1 + 7 == 8 再加上上一个进的1位就变成了9,当然我们也可以用数组来模拟。
- 首先创建三个数组,两个用来存放数据,一个用来存放最后的结果
- a[1000], b[1000],c[2010]
- 从这里我们就可以看出c数组是存放最后的答案的数组。
- 我们只能以字符串的形式输入,如果以整数的形式输入的话,这样就不能存放在数组里了,还得一个一个求余放进数组,所以以字符串输入。
- 但是我们输入都是正的输入也就是从先输入1,再输入2,最后输入3,也就是a[] = “123”,如果你在用a[1] 这样去加就会出错,1 在123里是百位数,而真正加法是从个位数开始加的,所以我们就要反转字符串.
for (int i = 0; i < str1.size(); i ++)
a[i] = str1[str.size()-1-i] - '0'; // 反转123
for (int i = 0; i < str2.size(); i ++)
b[i] = str2[str2.size()-1-i] - '0'; // 反转789
- 反转再顺便转化位整型,因为我们是用c++的,所以可以用string类,更加方便,不了解string类的人可以百度去查查,这里就不解释了。
- 现在两个整数都经过反转了就可以经行正常的模拟加法了
- 但是还有个问题,我们这里模拟的是两个数字长度相等的,还有不相等的呢,所以就要获取最大的长度对吧,只有知道了最大的长度这样我们就可以更好取实现循环,不然和容易出界
int len = max(str1.size(), str2.size());
接下来就是模拟加法了
for (int i = 0; i < len; i ++) {
c[i] = c[i] + a[i] + b[i];
c[i+1] = c[i] / 10; // a[i] + b[i] 可能会超过10,所以要有进位,这个就是模拟进位
c[i] = c[i] % 10; // 不管有没有进位就是取余数,没有超过10 求余也是原数,超过10,也是要个位数
}
- 这个就是标准的高精度加法, 为什么要在a[i] + b[i] 再加上 c[i], 这是因为a[i] + b[i]可能会超过10,会有进位,进位我们都是往前面加的,所以就是加到c[i+1] 上,所以c[i] 上原来可能会有值
- 接下来就是去除前导零,因为可能就像123 + 789一样最后加完之后还是三位数,所以就会有前导零。
len += 1;
if (c[len-1] == 0 && len > 1)
len -= 1;
- 为什么要先加一呢,还是一样的因为可能有进位这里是三位数如果有进位就是四位数但len == 3 所以要先加1,再判断这位置上是不是零,如果是零的话就要去掉,不是的就说明有值。
- 那为什么要判断len > 1呢,这样因为也可能是零加零,所以一定要保留一位数。
- 最后就是输出了。
for (int i = 0; i < len; i ++)
cout << c[len-1-i];
应该可以看懂吧读者,你可以在这里试下你学的怎么样(A+B Problem(高精))
这里再附上我这题的题解:
#include<iostream>
#include<string>
using namespace std;
const int N = 510;
int a[N], b[N], c[N];
int main()
{
string str1;
string str2;
cin >> str1;
cin >> str2;
for (int i = 0; i < str1.size(); i ++)
a[str1.size()-1 - i] = str1[i] - '0';
for (int i = 0; i < str2.size(); i ++)
b[str2.size()-1 - i] = str2[i] - '0';
int ans = max(str1.size(), str2.size());
for (int i = 0; i < ans; i ++){
c[i] += a[i] + b[i];
c[i+1] = c[i] / 10;
c[i] %= 10;
}
ans += 1;
if (c[ans-1] == 0 && ans > 1)
ans -= 1;
for (int i = 0; i < ans; i ++)
cout << c[ans-1-i];
return 0;
}
今天的文章高精度加法是什么_什么是进位加法「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69143.html