高精度!!!
代码来源@
高精度加法
//高精度加法代码精简版
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;//1005; 常量
char a[N],b[N];
int c[N];
int main() {
cin>>a>>b;
int ka=strlen(a)-1,kb=strlen(b)-1,kc=0;
//三个模拟指针,ka,kb分别指向a,b数组最高位,kc指向c数组最低位
while(ka>=0 || kb>=0){//只要还没加完
if(ka>=0)c[kc]+=a[ka--]-'0';//a[ka]没有加完则加入c[kc]中
if(kb>=0)c[kc]+=b[kb--]-'0';//同理,a[kb]合法则加入c[kc]中
c[kc+1]+=c[kc]/10;c[kc]%=10;//同时检查c[kc]进位给高位
kc++; //kc后移一位
}
if(!c[kc])kc--;//判断高位是否有数
for(int i=kc;i>=0;i--)cout<<c[i];
return 0;
}
高精度减法
//高精度减法
#include <bits/stdc++.h>
using namespace std;
string aa,bb;
bool flag=0;//默认符号为正数
int a[1005],b[1005],c[1005];
void look(int x[],int k){
cout<<endl;
for(int i=0;i<=k;i++){
cout<<x[i]<<" ";
}
cout<<endl;
}
int main() {
cin>>aa>>bb;
int la=aa.size(),lb=bb.size();
//确保a>b;
if(la<lb || (la==lb&&aa<bb)){
flag=1;//flag为1说明结果为负数
swap(aa,bb);
swap(la,lb);
}
for(int i=0;i<la;i++)//aa转为int倒序存储
a[i]=aa[la-i-1]-'0';
for(int i=0;i<lb;i++)//bb转为int倒序存储
b[i]=bb[lb-i-1]-'0';
for(int i=0;i<la;i++){//逐位相减
c[i]=a[i]-b[i];
}
for(int i=0;i<la;i++){//检查借位
if(c[i]<0){
c[i+1]--;
c[i]+=10;
}
}
int lc=la;
while(lc>0 && !c[lc])lc--;//删除前导0
if(flag)cout<<"-";
for(int i=lc;i>=0;i--) cout<<c[i];
return 0;
}
高精度乘法
//高精度乘法带符号
#include <bits/stdc++.h>
using namespace std;
string aa,bb;
int flaga=1,flagb=1;//默认符号为正数
int a[1005],b[1005],c[1005];
int main() {
cin>>aa>>bb;
//特判符号部分
if(aa[0]=='-'){
flaga=-1;//符号标记
aa.erase(0,1);//删除符号
};
if(bb[0]=='-'){
flagb=-1;//符号标记
bb.erase(0,1);//删除符号
};
//特判符号部分
int la=aa.size(),lb=bb.size(),lc=la+lb;
for(int i=0;i<la;i++)//aa转为int倒序存储
a[i]=aa[la-i-1]-'0';
for(int i=0;i<lb;i++)//bb转为int倒序存储
b[i]=bb[lb-i-1]-'0';
for(int i=0;i<la;i++){
for(int j=0;j<lb;j++){//逐位相乘
c[i+j]+=a[i]*b[j];
}
}
for(int i=0;i<lc;i++){//处理进位
c[i+1]+=c[i]/10;
c[i]%=10;;
}
while(lc>0 && !c[lc])lc--;//删除前导0
if(flaga*flagb<0)cout<<'-';//输出符号
for(int i=lc;i>=0;i--) cout<<c[i];
return 0;
}
高精度除法
//高精度除以单精度
#include <bits/stdc++.h>
using namespace std;
string aa;
bool flag=0;//默认符号为正数
long long a[1005],b,c[1005],r,pc=0;
int main() {
cin>>aa>>b;
int la=aa.size(),lc=la;
for(int i=0;i<la;i++)//aa转为int倒序存储
a[i]=aa[i]-'0';
for(int i=0;i<la;i++){
c[i]=(r*10+a[i])/b;
r=(r*10+a[i])%b;
}
while(pc<la && !c[pc])pc++;//删除前导0
for(int i=pc;i<lc;i++) cout<<c[i];
//cout<<endl<<r;//输出余数
return 0;
}