您的位置:首页 > 其它

高精度加法,减法

2018-03-07 23:09 253 查看
高精度运算:

是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。

对于一个高精度正整数,接受与存储的程序段如下:

输入处理

int na[110]={0},nb[110]={0};//用数组按位存放高精度正整数,初值全为0
int la=a.size(),lb=b.size();//高精度正整数的位数
/***数组从右向左存储,na[0]存放个位,na[1]存放十位...***/
for(int i=0;i<la;i++){
na[la-1-i]=a[i]-'0';
}
for(int i=0;i<lb;i++){
nb[lb-1-i]=b[i]-'0';
}


相加

int lmax=la>lb?la:lb;//选取最长长度开始相加
for(int i=0;i<lmax;i++){
na[i]+=nb[i];  //两数相加
na[i+1]+=na[i]/10;//要进的位
na[i]%=10;//进位后的数
}
//如果最高位大于10,即na[lmax-1+1]=1;lmax++
if(na[lmax]){
lmax++;//位数加1
}


处理最高进位

例如:当输入为00006 00003时

for(int i=lmax-1;i>=0;i--){
if(na[lmax-1]==0)
lmax--;
}


输出结果

for(int i=lmax-1;i>=0;i--){
ans+=na[i]+'0';//从高位到低位依次给字符串ans
}


完整代码

#include<bits/stdc++.h>
using namespace std;
const int L=110;
//两个非负整数相加
//方法 倒置相加再还原
string add(string a,string b){
string ans;
int na[L]={0},nb[L]={0};
int la=a.size(),lb=b.size();
//倒置
for(int i=0;i<la;i++){
na[la-1-i]=a[i]-'0';
}
for(int i=0;i<lb;i++){
nb[lb-1-i]=b[i]-'0';
}
//选取最长长度开始相加
int lmax=la>lb?la:lb;
for(int i=0;i<lmax;i++){
na[i]+=nb[i];
na[i+1]+=na[i]/10;
na[i]%=10;

}
//如果最高位大于10,即na[lmax-1+1]=1;lmax++
if(na[lmax]){
lmax++;
}
/***第一次没有处理高位为0d的情况***/
for(int i=lmax-1;i>=0;i--){
if(na[lmax-1]==0)
lmax--;
}
//还原
for(int i=lmax-1;i>=0;i--){
ans+=na[i]+'0';
}
return ans;
}

int main(){
//高精度加法
//用tring 类型传入参数  算法复杂度  O(n)
string a,b;
while(cin>>a>>b){
cout<<add(a,b)<<endl;
}
return 0;
}


减法运算同理

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int L=110;
string sub(string a,string b){
string ans;
int na[L]={0},nb[L]={0};
int la=a.size(),lb=b.size();
int lmax=la>lb?la:lb;
for(int i=0;i<la;i++){
na[la-1-i]=a[i]-'0';
}
for(int i=0;i<lb;i++){
nb[lb-1-i]=b[i]-'0';
}
for(int i=0;i<lmax;i++){
na[i]=na[i]-nb[i];
if(na[i]<0){
na[i]=na[i]+10;
na[i+1]--;
}
}
for(int i=lmax-1;i>=0;i--){
if(na[lmax-1]==0){
lmax--;
}
}
for(int i=lmax-1;i>=0;i--){
ans+=na[i]+'0';
}
return ans;
}
int main(){
int T;
string a,b;
scanf("%d",&T);
while(T--){
cin>>a>>b;
cout<<sub(a,b)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: