高精加减

高精加


模拟竖式运算过程

idx 0 1 2 3
数组a 9 7 6 长度len1
数组b 8 7 长度len2
数组a 逆序排列→ 6 7 9
数组b 7 8
x(进位) 1 1 1
数组c 3 6 0 1

↓高精加模板代码

#include <bits/stdc++.h>
using namespace std;
const int leng=505;
int a[leng],b[leng],c[leng];
string s1,s2;

int main(){
	cin>>s1>>s2;
	int len1=s1.size();
	int len2=s2.size();
	//1.使用数组逆序存放,方便从低位开始相加,char转换成int
	for(int i=len1-1;i>=0;i--) a[len1-1-i]=s1[i]-48;
	for(int i=len2-1;i>=0;i--) b[len2-1-i]=s2[i]-48;
	int i,x=0;//进位
	int len=max(len1,len2);
	//2.模拟加法,x(进位)+a[i]+b[i]=c[i]
	for(i=0;i<len;i++){
		c[i]=a[i]+b[i]+x;
			x=c[i]/10;
			c[i]%=10;//放的是个位
	}
	c[i]=x;
	//3.逆序输出
	//前导0
	while(c[i]==0&&i>0) i--;
	for(;i>=0;i--) cout<<c[i];
	return 0;
}

高精减


idx 0 1 2 3
数组a (反过来读入) 6 7 9
数组b 7 8 7
数组c 9 8 1

高精减代码↓

#include <bits/stdc++.h>
using namespace std;
const int leng=10090;
int a[leng],b[leng],c[leng];
string s1,s2;

int main(){
	cin>>s1>>s2;
	int len1=s1.size();
	int len2=s2.size();
	//处理负号
	if(len1<len2 || len1==len2 && s1<s2){
	cout<<'-';
	swap(s1,s2);
	swap(len1,len2);
	}		
	//1.使用数组逆序存放,方便从低位开始相减,char转换成int
	for(int i=len1-1;i>=0;i--) a[len1-1-i]=s1[i]-48;
	for(int i=len2-1;i>=0;i--) b[len2-1-i]=s2[i]-48;
	int i;
	//2.模拟减法,a[i]-b[i]=c[i],注意借位
	for(i=0;i<len1;i++){
		c[i]=a[i]-b[i];
		if(c[i]<0){
			a[i+1]--;//从被减数上借位
			c[i]+=10;
		}
	}
	//3.逆序输出
	//前导0
	while(c[i]==0&&i>0) i--;
	for(;i>=0;i--) cout<<c[i];
	return 0;
}
posted @ 2023-08-30 18:26  Lost_Ycy  阅读(15)  评论(0)    收藏  举报