所谓高精度,就是大数的运算,这个大数可能是要远远超过现有数据类型的最大范围。如果我们想进行这样的运算,就要掌握计算的原理——竖式运算。
加法
我们这里先简单考虑非负数的加法,竖式这么列对吧:
可能比较简陋但是就是这个意思。
我们如何储存过长的数呢?可以用数组存储。怎么才能将各个数位上的数放到数组里面呢?这里,我们可以使用字符串。
我们使用逆序储存,这样会比较方便,后面可以在result
数组中反向输出。
// 高精度加法 240位内
int a[241]={},b[241]={},result[242]={},x=0,y=0;
string c,d;
cin>>c>>d;
// 第一步读取整数
for(int i=c.size()-1;i>=0;i--){
a[x++]=c[i]-'0';
}
for(int i=d.size()-1;i>=0;i--){
b[y++]=d[i]-'0';
}
接着,模拟运算:
// 第二步加法计算
for(int i=0;i<(x>y?x:y);i++){
result[i]+=(a[i]+b[i])%10;
result[i+1]+=(a[i]+b[i])/10;
}
反向输出:
for(int i=(x>y?x:y);i>=0;i--){
cout<<result[i];
}
完整的代码
// Author:PanDaoxi
#include
using namespace std;
int main(){
// 高精度加法 240位内
int a[241]={},b[241]={},result[242]={},x=0,y=0;
string c,d;
cin>>c>>d;
// 第一步读取整数
for(int i=c.size()-1;i>=0;i--){
a[x++]=c[i]-'0';
}
for(int i=d.size()-1;i>=0;i--){
b[y++]=d[i]-'0';
}
// 第二步加法计算
for(int i=0;i<(x>y?x:y);i++){
result[i]+=(a[i]+b[i])%10;
result[i+1]+=(a[i]+b[i])/10;
}
for(int i=(x>y?x:y);i>=0;i--){
cout<<result[i];
}
return 0;
}
减法
不说什么了,您能看懂我写的翔一样的代码嘛?
// Author:PanDaoxi
#include
using namespace std;
int main(){
string s1,s2;
int a[241]={},b[241]={},result[241]={},k=0,t;
cin>>s1>>s2;
// 考虑几种特殊情况
if(s1==s2){
cout<<0;
return 0;
}
if(s1.size()<s2.size()||s1.size()==s2.size()&&s1<s2){
cout<<"-";
swap(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';
}
// 模拟竖式的算法
for(int i=0;i<(s1.size()>s2.size()?s1.size():s2.size());i++){
t=10-b[i]+a[i]+result[k++];
if(t<10) result[k]--; // 退位,在后面一位减去1
result[k-1]=t%10;
}
// 前面可能有0,从第一个不是0的数开始输出
for(int i=k-1;i>=0;i--){
if(result[i]>0){
t=i; // 记录第一个不是0的数
break;
}
}
// 输出
for(int i=t;i>=0;i--){
cout<<result[i];
}
return 0;
}
放到草稿纸上,想想就明白了。