高精加法是比较熟悉的一个高精了
但是现在要练习压位
一开始觉得
简单的合并就好
后来想起来还要
保证压的这几位是顺序
但是整体是倒序
想了个比较麻烦的办法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stdio.h>
using namespace std;
char a[600],b[600];
int la,lb,l,k,i,p1,p2,p3,cnt1,cnt2,pa[600],pb[600],ans[600],cnt,x;
int main()
{
gets(a);
gets(b);
la=strlen(a);
lb=strlen(b);
l=la%3;
k=0;
for(i=la-1;i>=l;i--)
{
k++;
if(k%3==1) p1=a[i]-'0';
if(k%3==2) p2=a[i]-'0';
if(k%3==0)
{
cnt1++;
p3=a[i]-'0';
pa[cnt1]=p3*100+p2*10+p1;
}
}
if(l==1) cnt1++,pa[cnt1]=a[0]-'0';
if(l==2) cnt1++,pa[cnt1]=(a[0]-'0')*10+a[1]-'0';
l=lb%3;
k=0;
for(i=lb-1;i>=l;i--)
{
k++;
if(k%3==1) p1=b[i]-'0';
if(k%3==2) p2=b[i]-'0';
if(k%3==0)
{
cnt2++;
p3=b[i]-'0';
pb[cnt2]=p3*100+p2*10+p1;
}
}
if(l==1) cnt2++,pb[cnt2]=b[0]-'0';
if(l==2) cnt2++,pb[cnt2]=(b[0]-'0')*10+b[1]-'0';
cnt=max(cnt1,cnt2);
for(i=1;i<=cnt;i++)
{
ans[i]+=pa[i]+pb[i];
x=ans[i]/1000;
ans[i+1]+=x;
ans[i]%=1000;
}
if(ans[cnt+1]!=0) cnt++;
printf("%d",ans[cnt]);
for(i=cnt-1;i>=1;i--)
printf("%03d",ans[i]);
return 0;
}
下面是比较简洁的压位代码
// num[0]用来保存数字位数。利用10000进制可以节省空间和时间。
hp & hp::operator = (const char* c)
{
memset(num,0,sizeof(num));
int n=strlen(c),j=1,k=1;
for (int i=1;i<=n;i++)
{
if (k==10000) j++,k=1;// 10000进制,4个数字才算1位。
num[j]+=k*(c[n-i]-'0');
k*=10;
}
num[0]=j;
return *this;
}