高精度四则运算
高精度加法
利用字符串保存数据 然后代码实现加法逻辑
上代码
#include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
char a1[5050],b1[5050];
int a[5050],b[5050],c[5050];
int lena,lenb,lenc;
int x;
//高精度最好封装成函数
void add(){
while(lenc<lena || lenc<lenb){
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10; //x为进位
c[lenc]%=10;
lenc++;
}
c[lenc]=x;//加法可能会进位 如5+5=10 高了一位需要处理
if(c[lenc]==0){
lenc--; //说明没进位 减回来
}
for(int i=lenc;i>=0;i--){
printf("%d",c[i]);
}
}
int main(){
//gets(a1); 洛谷这题用gets不行 害我以为自己做错了 检查代码了半天
cin >> a1;
//gets(b1);
cin >> b1;
lena=strlen(a1);
lenb=strlen(b1);
for(int i=0;i<lena;i++){
a[i]=a1[lena-1-i]-'0';
}
for(int i=0;i<lenb;i++){
b[i]=b1[lenb-1-i]-'0';
}
add();
return 0;
}
// freopen("testdata.in", "r", stdin);
高精度减法
例题 洛谷P2142
高精度减法相较于加法会复杂一点 因为会出现负数情况 需要进行特殊处理
代码如下
#include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
int a[15050],b[15050],c[15050];
char a1[15050],b1[15050],temp[15050];
int lena,lenb,lenc;
int fun(){
if(strlen(a1)>strlen(b1)){
return 1;
}
else if(strlen(b1)>strlen(a1)){
return 0;
}
else if(strcmp(a1,b1)>=0){
return 1;
};
return 1;
}
void jian(){
while(lenc<lena || lenc<lenb){
if(a[lenc]-b[lenc]<0){
a[lenc+1]--;//如果不够就借位 高位-1
a[lenc]+=10;
}
c[lenc]=a[lenc]-b[lenc];
lenc++;
}
while(c[lenc]==0&&lenc>0){//处理无效0 如101-100=001
lenc--;
}
for(int i=lenc;i>=0;i--){
printf("%d",c[i]);
}
}
int main(){
cin >> a1;
cin >> b1;
if(!fun()){//判断a1和b1的大小 如果b1比a1大 就交换同时直接输出负号
printf("-");
strcpy(temp,a1);
strcpy(a1,b1);
strcpy(b1,temp);
}
lena=strlen(a1);
lenb=strlen(b1);
for(int i=0;i<lena;i++){
a[lena-i-1]=a1[i]-'0';
}
for(int i=0;i<lenb;i++){
b[lenb-i-1]=b1[i]-'0';
}
jian();
return 0;
}
// freopen("testdata.in", "r", stdin);
高精度乘法
洛谷P1303
高精度乘法其实最主要在于如何去实现乘法的逻辑
代码:
#include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
char a1[10005],b1[10005];
int a[10005],b[10005],c[10005];
int lena,lenb,lenc;
void mul(){
for(int i=1;i<=lenb;i++)
for(int j=1;j<=lena;j++)
c[i+j-1]+=a[j]*b[i];//乘法运算的本质实现就是一个二重循环 然后计算完以后统一进位
for(int i=1;i<lena+lenb;i++)
if(c[i]>9)
{ //进位处理
c[i+1]+=c[i]/10;
c[i]%=10;
}
lenc=lena+lenb;
while(c[lenc]==0&&lenc>1)lenc--;//处理无效0 0x10=000
for(int i=lenc;i>=1;i--)cout<<c[i];
}
int main(){
cin >>a1>>b1;
lena=strlen(a1);lenb=strlen(b1);
for(int i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
for(int i=1;i<=lenb;i++)b[i]=b1[lenb-i]-'0';
mul();
return 0;
}
// freopen("testdata.in", "r", stdin);
高精度除法
简单一点的是高精度除法除以低精度数据
代码
#include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
char a1[10005],c1[10005];
int a[10005],c[10005];
int lena,lenc,b,x,s;
void fun(){
for(int i=0;i<lena;i++){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
if(c[i]!=0){
s++;
}
if(s==0) continue;//避免第一位除不够 出0的情况
c[lenc++]=c[i];
}
for(int i=0;i<lenc;i++) printf("%d",c[i]);
}
int main(){
cin >> a1;
cin >> b;
lena=strlen(a1);
for(int i=0;i<lena;i++){
a[i]=a1[i]-'0';
}
fun();
return 0;
}
// freopen("testdata.in", "r", stdin);