[P1601]高精加法[压位]

    xiaoxiao2021-03-26  17

    原题链接

    高精加法是比较熟悉的一个高精了 但是现在要练习压位 一开始觉得 简单的合并就好 后来想起来还要 保证压的这几位是顺序 但是整体是倒序 想了个比较麻烦的办法

    #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("d",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; }
    转载请注明原文地址: https://ju.6miu.com/read-659766.html

    最新回复(0)