写在最前、
高精度算法将数组的操作发挥至淋漓,是对各类模拟运算处理的细化考量,
从模拟加法进位,小试牛刀,到减法中“大减小”模型的构造,
从乘法的错位运算,直到多法结合的高精度除法,
只有踩过坑,才知晓细节挖掘的不易。
* 全局变量初始为空,多次输入自行添加memset
// 加法
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 100010
using namespace std;
char sa[MAX],sb[MAX];
int a[MAX],b[MAX],len,lena,lenb;
int main()
{
scanf("%s%s",sa,sb);
lena=strlen(sa);
lenb=strlen(sb);
len=max(lena,lenb);
for(int i=lena-1;i>=0;i--)
a[lena-i]=sa[i]-'0';
for(int i=lenb-1;i>=0;i--)
b[lenb-i]=sb[i]-'0';
//1到len对应存储低位到高位
for(int i=1;i<=len;i++)
{
a[i+1]+=(a[i]+b[i])/10;
a[i]=(a[i]+b[i])%10;
}
if(a[len+1]>0)len++;
for(int i=len;i>=1;i--)
printf("%d",a[i]);
return 0;
}
// 减法
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 100010
using namespace std;
char sa[MAX],sb[MAX];
int a[MAX],b[MAX],flag,len,lena,lenb;
int main()
{
scanf("%s%s",sa,sb);
lena=strlen(sa);
lenb=strlen(sb);
len=max(lena,lenb);
for(int i=lena-1;i>=0;i--)
a[lena-i]=sa[i]-'0';
for(int i=lenb-1;i>=0;i--)
b[lenb-i]=sb[i]-'0';
//1到len对应存储低位到高位
if(lena==lenb)
{
if(strcmp(sa,sb)==0){printf("0");return 0;}//两数相同相减为0
for(int i=len;i>=1;i--)//位数相同,从高位开始逐步比较
if(a[i]<b[i]){flag=1;break;}//得出a数小于b数
}
if(lena<lenb||flag){flag=1;swap(a,b);}//互换,构造大数减小数
for(int i=1;i<=len;i++)
{
if(a[i]<b[i]){a[i]+=10;a[i+1]-=1;}
a[i]-=b[i];
}
while(!a[len])len--;//去除前导0
if(flag)printf("-");//小数减大数结果为负
for(int i=len;i>=1;i--)
printf("%d",a[i]);
return 0;
}
// 乘法
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 100010
using namespace std;
char sa[MAX],sb[MAX];
int a[MAX],b[MAX],c[MAX],len,lena,lenb;
int main()
{
scanf("%s%s",sa,sb);
lena=strlen(sa);
lenb=strlen(sb);
len=lena+lenb;
for(int i=lena-1;i>=0;i--)
a[lena-i]=sa[i]-'0';
for(int i=lenb-1;i>=0;i--)
b[lenb-i]=sb[i]-'0';
if(a[lena]==0||b[lenb]==0){printf("0");return 0;}
//任一为0,乘积为0
for(int i=1;i<=lena;i++)
for(int j=1;j<=lenb;j++)
c[i+j-1]+=a[i]*b[j];
//模拟竖式乘法,每次乘一位,错开
for(int i=1;i<=len;i++)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}//处理进位
len++;//虚拟进位
c[len]=c[len-1]/10;
c[len-1]%=10;
while(!c[len])len--;//高位无需进位
for(int i=len;i>=1;i--)
printf("%d",c[i]);
return 0;
}
// 除法
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 100010
char sa[MAX],sb[MAX];
int a[MAX],b[MAX],c[MAX],d[MAX],flag,len,lena,lenb;
int compare()
{
int l=len;
flag=0;
while(l)
{
if(d[l]>b[l]){flag=1;break;}
else if(d[l]==b[l]){flag=1;l--;}
else{flag=0;break;}
}
return flag;
}
void jianfa()
{
for(int i=1;i<=len;i++)
{
if(d[i]<b[i]){d[i+1]--;d[i]+=10;}
d[i]-=b[i];
}
}
void cheng()
{
for(int i=1;i<=len;i++)
d[i]*=10;
for(int i=1;i<=len;i++)
{
d[i+1]+=d[i]/10;
d[i]%=10;
}
}
int main()
{
scanf("%s%s",sa,sb);
lena=strlen(sa);
lenb=strlen(sb);
len=lena;
for(int i=1;i<=lena;i++)
a[i]=sa[lena-i]-'0';
for(int i=1;i<=lenb;i++)
b[i]=sb[lenb-i]-'0';
for(int i=len;i>=1;i--)
{
d[1]=a[i];
compare();
while(flag)
{
jianfa();
c[i]++;
compare();
}
cheng();
}
while(len>1&&!c[len])
len--;
for(int i=len;i>=1;i--)
printf("%d",c[i]);
return 0;
}