高精度四则运算

高精度加法

利用字符串保存数据 然后代码实现加法逻辑

洛谷P1601

上代码

#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);

高精度除法

简单一点的是高精度除法除以低精度数据

洛谷P1480

代码

#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);
posted @ 2020-08-18 14:45  一个经常掉线的人  阅读(131)  评论(0编辑  收藏  举报