打算把常见的板子敲一遍=-= 先从高精度开始吧
加
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
#define re register
using namespace std;
const int N=1100;
char a1[N],a2[N];
int n1[N],n2[N],ans[N],l1,nl1,l2,nl2,addn;
int main(){
scanf("%s%s",a1+1,a2+1);
nl1=l1=strlen(a1+1); nl2=l2=strlen(a2+1);
for (int i=1; i<=l1; i++) n1[i]=a1[i]-'0';
for (int i=1; i<=l2; i++) n2[i]=a2[i]-'0';
if (l1>=l2){
while (nl2>0){
ans[nl1]=(n1[nl1]+n2[nl2]+addn)%10;
if (n1[nl1]+n2[nl2]+addn>=10) addn=1;
else addn=0;
nl1--; nl2--;
}
for (int i=nl1; i>=0; i--){
ans[i]=(n1[i]+addn)%10;
if (n1[i]+addn>=10) addn=1;
else addn=0;
}
}
if (l1<l2){
while (nl1>0){
ans[nl2]=(n1[nl1]+n2[nl2]+addn)%10;
if (n1[nl1]+n2[nl2]+addn>=10) addn=1;
else addn=0;
nl1--; nl2--;
}
for (int i=nl2; i>=0; i--){
ans[i]=(n2[i]+addn)%10;
if (n2[i]+addn>=10) addn=1;
else addn=0;
}
}
for (int i=((ans[0]==0)?1:0); i<=max(l1,l2); i++) printf("%d",ans[i]);
return 0;
}
减
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
#define re register
using namespace std;
const int N=11000;
char a1[N],a2[N];
int n1[N],n2[N],ans[N],l1,nl1,l2,nl2;
int cmp(){
if (l1>l2) return 1;
if (l1<l2) return 0;
for (int i=1; i<=l1; i++){
if (n1[i]>n2[i]) return 1;
if (n1[i]<n2[i]) return 0;
}
return -1;
}
int main(){
scanf("%s%s",a1+1,a2+1);
nl1=l1=strlen(a1+1); nl2=l2=strlen(a2+1);
for (int i=1; i<=l1; i++) n1[i]=a1[i]-'0';
for (int i=1; i<=l2; i++) n2[i]=a2[i]-'0';
int c=cmp();
if (c==1){
while (nl2>0){
if (n1[nl1]>=n2[nl2]) ans[nl1]=n1[nl1]-n2[nl2];
else{
int j=nl1-1;
while (n1[j]==0){
n1[j]=9;
j--;
}
n1[j]--;
ans[nl1]=10+n1[nl1]-n2[nl2];
}
nl1--; nl2--;
}
for (int i=nl1; i>0; i--) ans[i]=n1[i];
int k=1;
while (ans[k]==0) k++;
for (int i=k; i<=l1; i++) printf("%d",ans[i]);
}
if (c==0){
printf("-");
while (nl1>0){
if (n2[nl2]>=n1[nl1]) ans[nl2]=n2[nl2]-n1[nl1];
else{
int j=nl2-1;
while (n2[j]==0){
n2[j]=9;
j--;
}
n2[j]--;
ans[nl2]=10+n2[nl2]-n1[nl1];
}
nl1--; nl2--;
}
for (int i=nl2; i>0; i--) ans[i]=n2[i];
int k=1;
while (ans[k]==0) k++;
for (int i=k; i<=l2; i++) printf("%d",ans[i]);
}
if (c==-1) printf("0");
return 0;
}
乘
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
#define re register
using namespace std;
const int N=11000;
char a1[N],a2[N];
int n1[N],n2[N],l1,l2,cnt,addn,ans[N][N],ans1[N];
int main(){
scanf("%s%s",a1+1,a2+1);
l1=strlen(a1+1); l2=strlen(a2+1);
for (int i=1; i<=l1; i++) n1[i]=a1[i]-'0';
for (int i=1; i<=l2; i++) n2[i]=a2[i]-'0';
if ((l1==1 && n1[1]==0) || (l2==1 && n2[1]==0)) printf("0");
else{
for (int i=l2; i>0; i--){
cnt++; addn=0;
for (int j=l1; j>0; j--){
ans[cnt][i+j]=(n2[i]*n1[j]+addn)%10;
addn=(n2[i]*n1[j]+addn-(n2[i]*n1[j]+addn)%10)/10;
}
ans[cnt][i]=addn;
}
addn=0;
for (int i=l1+l2; i>=0; i--){
int a=0;
for (int j=1; j<=cnt; j++){
a+=ans[j][i];
}
ans1[i]=(a+addn)%10;
addn=(a+addn-(a+addn)%10)/10;
}
if (addn!=0) printf("%d",addn);
int j=0;
while (ans1[j]==0) j++;
for (int i=j; i<=l1+l2; i++) printf("%d",ans1[i]);
}
return 0;
}
写的好丑。。有时间修一下