- 分享
高精度算法——高精度加法
- 2022-9-7 20:50:42 @
高精度加法是信息学的一种重要算法。这种算法使用多个存储单位进行计算,因此它的计算范围超过一般使用一个存储单位的算法。也是一些信息学竞赛的常考题目。
c/c++
最大也就是unsigned long long
也就才位
如果要几百位的相加减就不行了,所以就要用高精度了,但高精度是什么呢,一句话,就是处理很大的数相加减之类就比如几百位的数相加,就是很大的数。
高精度加法,其实就是竖式加法啦。
也就是从最低位开始,将两个加数对应位置上的数码相加,并判断是否达到或超过 。如果达到,那么处理进位:将更高一位的结果上增加1,当前位的结果减少10。
最终算法:
(算法不懂的请看注释)
void add(int a[], int b[], int c[]) {
clear(c);
// 高精度实现中,一般令数组的最大长度 LEN 比可能的输入大一些
// 然后略去末尾的几次循环,这样一来可以省去不少边界情况的处理
// 因为实际输入不会超过 1000 位,故在此循环到 LEN - 1 = 1003 已经足够
for (int i = 0; i < LEN - 1; ++i) {
// 将相应位上的数码相加
c[i] += a[i] + b[i];
if (c[i] >= 10) {
// 进位
c[i + 1] += 1;
c[i] -= 10;
}
}
}
算法都教了,怎能不上食用方法呢?
(食用方法注释由提供)
食用方法:
#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';//转换为int
for (int i = 0; i < str2.size(); i ++)
b[str2.size()-1 - i] = str2[i] - '0';//转换为int
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;
}
0 条评论
目前还没有评论...