洛谷 P1932 A+B A-B A*B A/B A%B Problem(高精度板子)

传送门

解题思路

板子没啥好讲的。
就是要注意以下几点:

  • 进位时条件是 \(\geqslant10\) 而不是 \(>10\)
  • string中的某个位置若没有初始化,会炸,所以要在读入的字符串最后加上0。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=20005;
int ans[maxn],x[maxn],lenx; 
string s1,s2;
int len1,len2,len3;
inline void print(int len){
	for(int i=len-1;i>=0;i--) printf("%d",ans[i]);
	printf("\n");
}
bool cmp(){
	if(len1>len2) return 1;
	if(len1<len2) return 0;
	for(int i=len1-1;i>=0;i--){
		if(s1[i]>s2[i]) return 1;
		if(s1[i]<s2[i]) return 0;
	}
	return 1;
}
void jia(){
	len3=max(len1,len2); 
	for(int i=0;i<len3;i++){
		ans[i]=s1[i]-'0'+s2[i]-'0'+ans[i];
		if(ans[i]>=10){
			ans[i+1]++;
			ans[i]-=10;
			if(i==len3-1){
				print(len3+1);
				memset(ans,0,sizeof(ans));
				return;
			}
		}
	}
	print(len3);
	memset(ans,0,sizeof(ans));
}
void jian(){
	int type=0;
	if(!cmp()){
		type=1;
		swap(s1,s2);
		swap(len1,len2);
		printf("-");
	}
	for(int i=0;i<len1;i++){
		ans[i]+=s1[i]-s2[i];
		if(ans[i]<0) ans[i]+=10,ans[i+1]-=1;
	}
	for(len3=len1;len3>1;len3--){
		if(ans[len3-1]!=0) break;
	}
	print(len3);
	if(type==1){
		swap(s1,s2);
		swap(len1,len2);
	}
	memset(ans,0,sizeof(ans));
}
void cheng(){
	len3=len1+len2;
	for(int i=0;i<len1;i++){
		for(int j=0;j<len2;j++){
			ans[i+j]+=(s1[i]-'0')*(s2[j]-'0');
		}
	}
	for(int i=0;i<=len3;i++){
		if(ans[i]>=10) ans[i+1]+=ans[i]/10,ans[i]%=10;
	}
	for(;len3>1;len3--){
		if(ans[len3-1]!=0) break;
	}
	print(len3);
	memset(ans,0,sizeof(ans));
}
void cheng(int *x){
	lenx++;
	for(int i=0;i<=lenx;i++) x[i]*=10;
	for(int i=0;i<=lenx;i++){
		if(x[i]>=10) x[i+1]+=x[i]/10,x[i]%=10;
	}
	for(;lenx>1;lenx--){
		if(x[lenx-1]!=0) break;
	}
}
bool dayu(int *x){
	if(lenx<len2) return 0;
	if(lenx>len2){
		for(int i=0;i<lenx;i++) x[i]-=s2[i]-'0';
		for(int i=0;i<lenx;i++){
			if(x[i]<0) x[i+1]--,x[i]+=10;
		}
		for(;lenx>1;lenx--){
			if(x[lenx-1]!=0) break;
		}
		return 1;
	}
	for(int i=lenx-1;i>=0;i--){
		if(x[i]>s2[i]-'0') break;
		if(x[i]<s2[i]-'0') return 0; 
	}
	for(int i=0;i<lenx;i++) x[i]-=s2[i]-'0';
	for(int i=0;i<lenx;i++){
		if(x[i]<0) x[i+1]--,x[i]+=10;
	}
	for(;lenx>1;lenx--){
		if(x[lenx-1]!=0) break;
	}
	return 1;
}
void chu(){
	if(!cmp()){
		printf("0\n");
		for(int i=len1-1;i>=0;i--) printf("%c",s1[i]);
		return;
	}
	len3=len1-len2+1;
	lenx=len2;
	for(int i=len1-1;i>=len3;i--) x[i-len3]=s1[i]-'0';
	for(int i=len3-1;i>=0;i--){
		cheng(x);
		x[0]=s1[i]-'0';
		while(dayu(x)){
			ans[i]++;
		}
	}
	for(;len3>1;len3--){
		if(ans[len3-1]!=0) break;
	}
	print(len3);
	for(int i=lenx-1;i>=0;i--) printf("%d",x[i]);
}
int main(){
	cin>>s1>>s2;
	len1=s1.length();
	len2=s2.length();
	reverse(s1.begin(),s1.end());
	reverse(s2.begin(),s2.end());
	for(int i=len1;i<=maxn;i++) s1+='0';
	for(int i=len2;i<=maxn;i++) s2+='0'; 
	jia();
	jian();
	cheng();
	chu();
	return 0;
}
posted @ 2021-06-03 23:53  尹昱钦  阅读(186)  评论(0编辑  收藏  举报