将拖欠已久的高精度做完。。。。(虽说以前就做过但是由于各种原因导致代码神秘失踪,只得从来QWQ)
高精度加法
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
char x[1000],y[1000];
char a[1000],b[1000];
int i,j;
void fanzhuanchucun()
{
for (i=strlen(a)-1,j=0;i>=0;i--,j++)
{
x[j]=a[i]-48;
}
for (i=strlen(b)-1,j=0;i>=0;i--,j++)
{
y[j]=b[i]-48;
}
}
void shushijisuan()
{
for (i=0;i<1000;i++)
{
x[i]+=y[i];
if (x[i]>=10)
{
x[i+1]++;
x[i]-=10;
}
}
}
int main()
{
scanf("%s",a);
scanf("%s",b);
fill(x,x+1000,'\0');
fill(y,y+1000,'\0');
fanzhuanchucun();
shushijisuan();
i=999;
while (x[i]=='\0') i--;
if (i<0) printf("0");
for (;i>=0;i--)
{
printf("%c",x[i]+48);
}
return 0;
}
高精度减法
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<stack>
using namespace std;
char x[100010],y[100010];
int a[100010],b[100010];
int main()
{
int flag=0,len;
scanf("%s",x);
scanf("%s",y);
if(x[0]=='0'&&y[0]=='0')
{
cout<<0;
return 0;
}
int x1=strlen(x),y1=strlen(y);
len=y1;
if(x1<y1){flag=1;len=x1;}
if(x1==y1)
{
int t=0;
while(t<=x1)
{
t++;
if(x[t]>y[t]) break;
if(x[t]<y[t]) {flag=1;break;}
}
if(t==x1+1) {cout<<0;return 0;}
}
for(int i=0;i<x1;i++)
{
a[x1-i-1]=x[i]-48;
}
for(int i=0;i<y1;i++)
{
b[y1-i-1]=y[i]-48;
}
if(flag==0)
{
for(int i=0;i<len;i++)
{
a[i]=a[i]-b[i];
if(a[i]<0)
{
a[i+1]-=1;
a[i]+=10;
}
}
for(int i=0;i<x1;i++)
{
if(a[i]<0)
{
a[i+1]-=1;
a[i]+=10;
}
}
for(int i=x1-1;i>=0;i--)
{
if(a[i]!=0) {len=i;break;}
}
for(int i=len;i>=0;i--)
printf("%d",a[i]);
return 0;
}
else
{
for(int i=0;i<len;i++)
{
b[i]=b[i]-a[i];
if(b[i]<0)
{
b[i+1]-=1;
b[i]+=10;
}
}
for(int i=0;i<y1;i++)
{
if(b[i]<0)
{
b[i+1]-=1;
b[i]+=10;
}
}
for(int i=y1-1;i>=0;i--)
{
if(b[i]!=0) {len=i;break;}
}
printf("-");
for(int i=len;i>=0;i--)
printf("%d",b[i]);
return 0;
}
return 0;
}
高精度乘法:
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<stack>
using namespace std;
char x[100010],y[100010];
int a[100010],b[100010],c[100010];
int main()
{
int flag=0,len;
scanf("%s",x);
scanf("%s",y);
if(x[0]=='0'||y[0]=='0')
{
cout<<0;
return 0;
}
int x1=strlen(x),y1=strlen(y),k=0;
if(x[0]=='-')
{
k++;
for(int i=0;i<x1-1;i++)
{
x[i]=x[i+1];
}
x1--;
}//去0
if(y[0]=='-')
{
k++;
for(int i=0;i<y1-1;i++)
{
y[i]=y[i+1];
}
y1--;
} //去0
len=y1;
int t=0;
if(x1<y1){flag=1;len=x1;}
if(flag==0&&y[y1-1]=='0')
{
for(int i=y1-1;i>=0;i--)
{
if(y[i]=='0') {t++;}
if(y[i]!='0') break;
}
y1-=t;
len-=t;
}
if(flag==1&&x[x1-1]=='0')
{
for(int i=x1-1;i>=0;i--)
{
if(x[i]=='0') {t++;}
if(x[i]!='0') break;
}
x1-=t;
len-=t;
}
for(int i=0;i<x1;i++)
{
a[x1-i-1]=x[i]-48;
}
for(int i=0;i<y1;i++)
{
b[y1-i-1]=y[i]-48;
}
if(flag==0)
{
for(int i=0;i<len;i++)
for(int j=0;j<x1;j++)
{
c[i+j]=c[i+j]+a[j]*b[i];
c[i+j+1]+=c[i+j]/10;
c[i+j]=c[i+j]%10;
}
int kl=len+x1-1;
if(k==1) printf("-");
if(c[kl]!=0) printf("%d",c[kl]);
for(int i=kl-1;i>=0;i--)
{
printf("%d",c[i]);
}
if(t>0)
{
for(int i=1;i<=t;i++)
cout<<0;
}
return 0;
}
if(flag==1)
{
for(int i=0;i<len;i++)
for(int j=0;j<y1;j++)
{
c[i+j]=c[i+j]+b[j]*a[i];
c[i+j+1]+=c[i+j]/10;
c[i+j]=c[i+j]%10;
cout<<c[i+j]<<endl;
}
int kl=len+y1-1;
if(k==1) printf("-");
if(c[kl]!=0) printf("%d",c[kl]);
for(int i=kl-1;i>=0;i--)
{
printf("%d",c[i]);
}
if(t>0)
{
for(int i=1;i<=t;i++)
cout<<0;
}
return 0;
}
}