高精度计算
【高精加】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[510],la,b[510],lb,c[510];
int main()
{
int x=0; char ch=getchar();
while(!(ch>='0'&&ch<='9')) ch=getchar();
while(ch>='0'&&ch<='9') a[++la]=ch-'0',c[la]=a[la],ch=getchar();
for(int i=la;i;i--) a[i]=c[la-i+1];
while(!(ch>='0'&&ch<='9')) ch=getchar();
while(ch>='0'&&ch<='9') b[++lb]=ch-'0',c[lb]=b[lb],ch=getchar();
for(int i=lb;i;i--) b[i]=c[lb-i+1];
int len=max(la,lb);
memset(c,0,sizeof(c));
for(int i=1;i<=len;++i)
c[i]+=a[i]+b[i],c[i+1]+=c[i]/10,c[i]%=10;
while(c[len]>=10) c[len+1]=c[len]/10,c[len]%=10,len++;
while(!c[len]) len--;
for(int i=len;i>0;--i) printf("%d",c[i]);
return 0;
}
【高精减】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[510],b[510],c[510],la,lb,len;
inline void jian(int a[],int b[])
{
for(int i=1;i<=len;++i)
if(a[i]>=b[i]) c[i]+=a[i]-b[i];
else a[i+1]-=1,c[i]+=a[i]+10-b[i];
while(!c[len]) len--;
}
int main()
{
int x; char ch=getchar();
while(!(ch>='0'&&ch<='9')) ch=getchar();
while(ch>='0'&&ch<='9') a[++la]=ch-'0',c[la]=a[la],ch=getchar();
for(int i=la;i;i--) a[i]=c[la-i+1];
while(!(ch>='0'&&ch<='9')) ch=getchar();
while((ch>='0'&&ch<='9')) b[++lb]=ch-'0',c[lb]=b[lb],ch=getchar();
for(int i=lb;i;i--) b[i]=c[lb-i+1];
memset(c,0,sizeof(c));
len=max(la,lb);
if(la<lb) jian(b,a),printf("-");
else jian(a,b);
for(int i=len;i;i--) printf("%d",c[i]);
return 0;
}
【高精乘】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[510],b[510],c[510],la,lb,len;
int main()
{
int x; char ch=getchar();
while(!(ch>='0'&&ch<='9')) ch=getchar();
while(ch>='0'&&ch<='9') a[++la]=ch-'0',c[la]=a[la],ch=getchar();
for(int i=la;i;i--) a[i]=c[la-i+1];
while(!(ch>='0'&&ch<='9')) ch=getchar();
while(ch>='0'&&ch<='9') b[++lb]=ch-'0',c[lb]=b[lb],ch=getchar();
for(int i=lb;i;i--) b[i]=c[lb-i+1];
memset(c,0,sizeof(c));
for(int i=1;i<=la;++i)
for(int j=1;j<=lb;++j)
c[i+j-1]+=a[i]*b[j],c[i+j]+=c[i+j-1]/10,c[i+j-1]%=10;
len=la+lb;
while(c[len]>=10) c[len+1]=c[len]/10,c[len]%=10,len++;
while(!c[len]) len--;
for(int i=len;i;i--) printf("%d",c[i]);
return 0;
}
【高精除】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[510],b[510],c[510];
inline int check(int a[],int b[])
{
if(a[0]<b[0]) return -1;
if(a[0]>b[0]) return 1;
for(int i=a[0];i;i--)
{
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;
}
inline void copy(int b[],int tmp[],int len)
{
for(int i=1;i<=b[0];i++) tmp[i+len-1]=b[i];
tmp[0]=b[0]+len-1;
}
inline void solve(int a[],int b[])
{
int t=check(a,b);
if(!t) {a[0]=0; return;}
if(t)
{
for(int i=1;i<=a[0];i++)
if(a[i]<b[i]) a[i+1]-=1,a[i]+=10,a[i]-=b[i];
else a[i]-=b[i];
}
while(a[0]&&!a[a[0]]) a[0]--;
}
inline void gaochu(int a[],int b[],int c[])
{
int tmp[510];
c[0]=a[0]-b[0]+1;
for(int i=c[0];i;i--)
{
memset(tmp,0,sizeof(tmp));
copy(b,tmp,i);
while(check(a,tmp)>=0) c[i]++,solve(a,tmp);
}
while(c[0]&&!c[c[0]]) c[0]--;
}
int main()
{
char ch=getchar();
while(!(ch>='0'&&ch<='9')) ch=getchar();
while(ch>='0'&&ch<='9') a[++a[0]]=ch-'0',c[a[0]]=a[a[0]],ch=getchar();
for(int i=a[0];i;i--) a[i]=c[a[0]-i+1];
while(!(ch>='0'&&ch<='9')) ch=getchar();
while(ch>='0'&&ch<='9') b[++b[0]]=ch-'0',c[b[0]]=b[b[0]],ch=getchar();
for(int i=b[0];i;i--) b[b[0]-i+1]=c[i];
memset(c,0,sizeof(c));
if(b[0]==1&&!b[1]) return 0;
gaochu(a,b,c);
for(int i=c[0];i;i--) printf("%d",c[i]);
return 0;
}
既然无能更改,又何必枉自寻烦忧