//高精加:模拟竖式,让两个数每一位对应加,满10就进一//高精减:依旧模拟竖式,先比较减数和被减数的大小,如果减数>被减数,就让减数减去被减数,输出时加“-”//高精乘:模拟竖式时要注意是两重循环,一个规律:c[i+j-1]=a[i]*b[j]+c[i+j-1]#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char a1[
10000],b1[
10001];
int k,t,a[
10001],b[
10001],ans[
100000001],c[
10001];
void he()
{
int lenc=
1,x=
0;
memset(ans,0,
sizeof(ans));
while(lenc<=t||lenc<=
k)
{
ans[lenc]=a[lenc]+b[lenc]+
x;
x=ans[lenc]/
10;
ans[lenc]%=
10;
lenc++
;
}
ans[lenc]=x;
if(ans[lenc]==
0)lenc--
;
for(
int i=lenc;i>=
1;i--)cout<<ans[i];cout<<
endl;
}
void cha(
int a[],
int b[]
)//此处a数组为被减数,b数组为减数
{
memset(ans,0,
sizeof(ans));
int lenc=
1;
while(lenc<=k||lenc<=
t)
{
if(a[lenc]<
b[lenc])
{a[lenc]+=
10;a[lenc+
1]--
;}
ans[lenc]=a[lenc]-
b[lenc];
lenc++
;
}
while(ans[lenc]==
0&&lenc>
1)lenc--
;
if(fl){
for(
int i=lenc;i>=
1;i--)cout<<ans[i];cout<<
endl;
}
}
void ji()
{
memset(ans,0,
sizeof(ans));
for(
int i=
1;i<=k;i++
)
{ int x=
0;
for(
int j=
1;j<=t;j++
)
{ans[i+j-
1]=a[i]*b[j]+x+ans[i+j-
1];
x=ans[i+j-
1]/
10;
ans[i+j-
1]%=
10;
}
ans[i+t]=
x;
}
int lenc=k+
t;
while(ans[lenc]==
0&&lenc>
1)lenc--
;
for(
int i=lenc;i>=
1;i--)cout<<ans[i];cout<<
endl;
}int main()
{ scanf("%s",a1);
scanf("%s",b1);
k=
strlen(a1);
t=
strlen(b1);
for(
int i=
0;i<k;i++
)
a[k-i]=a1[i]-
48;
for(
int i=
0;i<t;i++
)
b[t-i]=b1[i]-
48;
a[0]=k;b[
0]=
t;
he();
if(k<t||(k==t&&strcmp(a1,b1)<
0))//比大小
{cout<<
"-";cha(b,a
);
}
else cha(a,b
);
ji();
}
一个板子。嗯(小白书里有)
转载于:https://www.cnblogs.com/lcez56jsy/p/10599039.html
相关资源:高精度运算(加,减,高精乘低精,高精乘高精)