当计算机进行数值运算时如果精度过高,普通的计算无法满足,那么便只能用恶心的高精度了。
高精度的存储
void init (int a[])
{
string s;
cin>>s;
a[0]=s.length();
for(int i=1;i<=a[0];i++)
a[i]=s[a[0]-i]-'0';
}
倒叙存储,字符串输入,数组输出。
加法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a1[110],b1[110];
int a[110],b[110],c[1010],la,lb,lc,x;
int main()
{
scanf("%s",a1);
scanf("%s",b1);
la=strlen(a1);lb=strlen(b1);
for(int i=0;i<la;i++) a[la-i]=a1[i]-'0';
for(int i=0;i<lb;i++) b[lb-i]=b1[i]-'0';
x=0;lc=1;
while(lc<=la||lc<=lb)
{
c[lc]=a[lc]+b[lc]+x;
x=c[lc]/10;
c[lc]%=10;
lc++;
}
c[lc]=x;
if(c[lc]==0) lc--;
for(int i=lc;i>=1;i--)
printf("%d",c[i]);
return 0;
}
减法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a1[110],b1[110],n[250];
int a[110],b[110],c[1010],la,lb,lc,x;
int main()
{
scanf("%s",a1);
scanf("%s",b1);
if(strlen(a1)<strlen(b1)||(strlen(a1)==strlen(b1)&&strcmp(a1,b1)<0))
{
strcpy(n,a1);
strcpy(a1,b1);
strcpy(b1,a1);
cout<<"-";
}
la=strlen(a1);lb=strlen(b1);
for(int i=0;i<la;i++) a[la-i]=a1[i]-'0';
for(int i=0;i<lb;i++) b[lb-i]=b1[i]-'0';
lc=1;
while(lc<=la||lc<=lb)
{
if(a[lc]<b[lc])
{
a[lc]+=10;
a[lc+1]--;
}
c[lc]=a[lc]-b[lc];
lc++;
}
while((c[lc]==0)&&(lc>1)) lc--;
for(int i=lc;i>=1;i--)
printf("%d",c[i]);
return 0;
}
乘法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a1[110],b1[110];
int a[110],b[110],c[1010],la,lb,lc,x;
int main()
{
scanf("%s",a1);
scanf("%s",b1);
la=strlen(a1);lb=strlen(b1);
for(int i=0;i<la;i++) a[la-i]=a1[i]-'0';
for(int i=0;i<lb;i++) b[lb-i]=b1[i]-'0';
for(int i=1;i<=la;i++)
{
x=0;
for(int j=1;j<=lb;j++)
{
c[i+j-1]+=a[i]*b[j]+x;
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+lb]=x;
}
lc=la+lb;
while(c[lc]==0&&lc>1) lc--;
for(int i=lc;i>=1;i--)
printf("%d",c[i]);
return 0;
}