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

Posted 尹昱钦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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;
}

以上是关于洛谷 P1932 A+B A-B A*B A/B A%B Problem(高精度板子)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P2286宠物收养场

洛谷P2286宠物收养场·改

使用 (a,b) -> a-b lambda 函数 java

知识汇总

Neon 指令,vsub_f32(a, b),是 a-b 还是 b-a?

两个变量值交换的方法