洛谷 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;
}