高精度是一种算法,通常用于计算long long 以上的不支持的数据。
虽然有时可以用unsigned long long ,但unsigned long long的范围是(0,2^32)。
不足以计算更大的数。
如果题目范围在0~18446744073709551615只间,那么,是可以使用的unsigned __int64的。
可题目给得更大了呢?
那就需要用到高精度了,高精度可以利用字符串(string)来完成。
看一道最简单的题:
题目描述
求两个不超过200位的非负整数的和
输入
有两行,每行是一个不超过200位的非负整数
输出
一行,即相加后的结果
样例输入
22222222222222
33333333333333333333
样例输出
33333355555555555555
就是求a+b的高精度。
高精度加法的定义非常简单,如下:
#define maxn 1000005
int a[maxn],b[maxn],c[maxn];//这里加了一个define
string A,B;
下一步就是输入了,需要用到for循环和一个储存变量len。
cin>>A>>B;
int len=max(A.length(),B.length());
for(int i=A.length()-1,j=1;i>=0;i--,j++){//这里用length()和size()都可以
a[j]=A[i]-'0';
}
for(int i=B.length()-1,j=1;i>=0;i--,j++){
b[j]=B[i]-'0';
}
下面就是整段代码的核心部分,累加计算。
for(int i=1;i<=len;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
if(c[len+1]){
len++;
}
最后只要将字符串数组输出即可完成高精度加法的代码。
for(int i=len;i>=1;i--){
printf("%d",c[i]);
}
把整段代码合并起来就是:
#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
int a[maxn],b[maxn],c[maxn];
int main(){
string A,B;
cin>>A>>B;
int len=max(A.length(),B.length());
for(int i=A.length()-1,j=1;i>=0;i--,j++){
a[j]=A[i]-'0';
}
for(int i=B.length()-1,j=1;i>=0;i--,j++){
b[j]=B[i]-'0';
}
for(int i=1;i<=len;i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]%=10;
}
if(c[len+1]){
len++;
}
for(int i=len;i>=1;i--){
printf("%d",c[i]);
}
return 0;
}
下期接着讲:高精度减法。