[大数模拟] 洛谷 P1601 P2142 P1303
高精度 + - * orz 除法不会 (搁着 准备补)
高精度取余
例如123对12取余,实际上就等于((1%1210+2)%1210+3)%12=3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
const int maxn = 10000+5;
char s1[maxn],s2[maxn];
int a[maxn],b[maxn],c[maxn];
void add() {
scanf("%s %s",s1,s2);
int len1=strlen(s1),len2=strlen(s2);
for(int i=0; i<len1; i++) a[len1-i]=s1[i]-'0';
for(int i=0; i<len2; i++) b[len2-i]=s2[i]-'0';
int l=1,g=0;//g是处理进位
while(l<=len1||l<=len2) {
c[l]=a[l]+b[l]+g;
g=c[l]/10;//超过10要进位
c[l]%=10;//进位后留下来的数
l++;
}
c[l]=g;//最后一位可能会进位。
while(c[l]==0&&l>=0) l--;//处理前置0
if(l==-1) printf("0");//结果为0
else for(; l>0; l--) printf("%d",c[l]);
printf("\n");
}
void sub(){
scanf("%s %s",s1,s2);
int len1=strlen(s1),len2=strlen(s2);
if((strcmp(s1,s2)==-1&&len1==len2)||len1<len2) swap(s1,s2),printf("-");
len1=strlen(s1),len2=strlen(s2);
for(int i=0; i<len1; i++) a[len1-i]=s1[i]-'0';
for(int i=0; i<len2; i++) b[len2-i]=s2[i]-'0';
int l=1,g=0;//g是处理借位
while(l<=len1||l<=len2) {
c[l]=a[l]-b[l]-g;
g=0;
while(c[l]<0){
g++;
c[l]+=10;
}//低于0要借位
l++;
}
c[l]-=g;//最后一位可能会借位。
while(c[l]==0&&l>=0) l--;//处理前置0
if(l==-1) printf("0");//结果为0
else for(; l>0; l--) printf("%d",c[l]);
printf("\n");
}
void mul(){
scanf("%s %s",s1,s2);
int len1=strlen(s1),len2=strlen(s2);
for(int i=0; i<len1; i++) a[len1-i]=s1[i]-'0';
for(int i=0; i<len2; i++) b[len2-i]=s2[i]-'0';
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
c[i+j-1]+=a[i]*b[j]; // +=
int l=len1+len2+1;
for(int i=0;i<=l;i++) while(c[i]>9) c[i+1]+=c[i]/10,c[i]%=10;
while(c[l]==0&&l>=0) l--;//处理前置0
if(l==-1) printf("0");//结果为0
else for(; l>0; l--) printf("%d",c[l]);
printf("\n");
}
int main() {
//add();
//sub();
mul();
return 0;
}