題解 P1601 【A+B Problem(高精)】
P1601 A+B Problem(高精)
題目描述
高精度加法,x相當於a+b problem,[b][color=red]不用考慮負數[/color][/b]
輸入輸出格式
輸入格式:
分兩行輸入a,b<=10^500
輸出格式:
輸出只有一行,代表A+B的值
輸入輸出樣例
輸入樣例:
輸出樣例:
比較簡單的高精度。
高精度。顧名思義,就是在很大的位數情況下進行運算。(炸int)
其基本思想就是用陣列進行模擬加法。
模擬近位。
最後遍歷陣列輸出。
附程式碼:
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 5 struct diff{ 6int len;short x[3005]; 7 8void read(){ 9int len_read; 10string read; 11cin>>read; 12len=0;len_read=read.size(); 13for(int i=len_read-1;i>=0;i--)x[++len]=read[i]-48; 14} 15 16void write(){ 17for(int i=len;i>=1;i--)printf("%d",x[i]); 18printf("\n"); 19return ; 20} 21 22struct diff operator+(struct diff tmp){ 23int c=0; 24struct diff ans; 25ans.len=tmp.len;if(len>ans.len)ans.len=len; 26for(int i=1;i<=ans.len;i++) 27{ 28ans.x[i]=x[i]+tmp.x[i]+c; 29c=ans.x[i]/10;ans.x[i]%=10; 30} 31if(c>0)ans.x[++ans.len]=c; 32return ans; 33} 34 }a,b; 35 36 int main(){ 37a.read();b.read();a=a+b;a.write(); 38return 0; 39 } View Code
我們每個人都應該做到精益求精,所以還可以將普通高精度昇華一下
那就是傳說中的 萬進位制高精度:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 string s1,s2; 5 int c,len,len1,a[100005],len2,b[100005]; 6 7 void turn() 8 { 9int x,y,lx=s1.size(),ly=s2.size(),l,r; 10int c[100005],d[100005]; 11l=lx/4;r=ly/4; 12x=lx-l*4;y=ly-r*4; 13for(int i=0;i<x;i++)c[1]=c[1]*10+s1[i]-48; 14for(int i=0;i<y;i++)d[1]=d[1]*10+s2[i]-48; 15for(int i=2;i<=l+1;i++)c[i-(x==0)]=(s1[4*(i-2)+x]-48)*1000+(s1[4*(i-2)+x+1]-48)*100+(s1[4*(i-2)+x+2]-48)*10+(s1[4*(i-2)+x+3]-48); 16for(int i=2;i<=r+1;i++)d[i-(y==0)]=(s2[4*(i-2)+y]-48)*1000+(s2[4*(i-2)+y+1]-48)*100+(s2[4*(i-2)+y+2]-48)*10+(s2[4*(i-2)+y+3]-48); 17len1=l+(x>0);len2=r+(y>0); 18for(int i=1;i<=len1;i++)a[i]=c[len1-i+1]; 19for(int i=1;i<=len2;i++)b[i]=d[len2-i+1]; 20 21 } 22 23 int main() 24 { 25cin>>s1>>s2; 26turn(); 27len=len1;if(len2>len)len=len2; 28for(int i=1;i<=len;i++) 29{ 30a[i]=a[i]+b[i]+c; 31c=a[i]/10000; 32a[i]%=10000; 33} 34if(c>0)a[++len]=c; 35printf("%d",a[len]); 36for(int i=len-1;i>=1;i--)printf("%04d",a[i]); 37return 0;/*萬進位制高精加*/ 38 } View Code
萬進位制高精加要注意輸出“printf("%04d",a[i]);”