高精度加法:
void jiafa(char *a,int lena,char *b,int lenb,char *res)
{
int i=lena-1,j=lenb-1,k=0;
while((i+1)||(j+1))
{
if(i!=-1)res[k]+=(int)(a[i--]-'0');
if(j!=-1)res[k]+=(int)(b[j--]-'0');
res[k+1]+=res[k]/10;
res[k++]%=10;
}
while(!res[k]&&k>1)k--;
if(res[k])k++;
res[k]=0;
for(int s=k-1; s>=0; s--)
res[s]+='0';
for(int s=0; s<=(k-1)/2; s++)
swap(res[s],res[k-1-s]);
}
高精度乘法:
void chengfa(char *a,int lena,char *b,int lenb,char *res)
{
int k=0;
for(int i=0;i<lena; i++)
for(int j=0; j<lenb; j++)
{
res[i+j]+=(int)((a[lena-1-i]-'0')*(b[lenb-1-j]-'0'));
if(res[i+j]>9)
{
res[i+j+1]+=res[i+j]/10;
res[i+j]%=10;
if(i+j+1>k)k=i+j+1;
}
else if(res[i+j]&&i+j>k)k=i+j;
}
for(int s=k; s>=0; s--)
res[s]+='0';
for(int s=0;s<=k/2;s++)
swap(res[s],res[k-s]);
}
高精度减法:
void jianfa(char *a,int lena,char *b,int lenb,char *res)
{
int ans[205];
memset(ans,0,sizeof(ans));
int i=lena-1,j=lenb-1,k=0;//a>b
while((i+1)||(j+1))
{
if(j!=-1)ans[k]+=a[i--]-b[j--];
else ans[k]+=a[i--]-'0';
if(ans[k]<0)
{
ans[k+1]-=1;
ans[k]+=10;
}
k++;
}
while(ans[k]==0&&k>=1)k--;
for(int s=k; s>=0; s--)
res[s]=ans[s]+'0';
for(int s=0; s<=k/2; s++)
swap(res[s],res[k-s]);
res[k+1]=0;
}
网友评论