高精度計算和豎式計算沒什麼區別,但由於數據很大需要用字元串讀入所以過程中可能會有一些小問題。高精度算是學oi的基本知識所以直接上我的優(chou)美(lou)代碼。 高精度演算法,屬於處理大數字的數學計算方法。在一般的科學計算中,會經常算到小數點後幾百位或者更多,當然也可能是幾千億幾百億的大數字。一般 ...
高精度計算和豎式計算沒什麼區別,但由於數據很大需要用字元串讀入所以過程中可能會有一些小問題。高精度算是學oi的基本知識所以直接上我的優(chou)美(lou)代碼。
高精度演算法,屬於處理大數字的數學計算方法。在一般的科學計算中,會經常算到小數點後幾百位或者更多,當然也可能是幾千億幾百億的大數字。一般這類數字我們統稱為高精度數,高精度演算法是用電腦對於超大數據的一種模擬加,減,乘,除,乘方,階乘,開方等運算。對於非常龐大的數字無法在電腦中正常存儲,於是,將這個數字拆開,拆成一位一位的,或者是四位四位的存儲到一個數組中, 用一個數組去表示一個數字,這樣這個數字就被稱為是高精度數。高精度演算法就是能處理高精度數各種運算的演算法,但又因其特殊性,故從普通數的演算法中分離,自成一家。--百度百科
高精度加法(洛谷P1601)
題目描述
高精度加法,x相當於a+b problem,不用考慮負數。
輸入輸出格式
輸入格式:
分兩行輸入a,b<=10^500
輸出格式:
輸出只有一行,代表A+B的值
輸入輸出樣例
輸入樣例#1:1 1輸出樣例#1:
2
#include<cstdio> #include<cstring> #include<string> #include<iostream> using namespace std; int n,k; char shu1[1001],shu2[1001]; char c1[1001],c2[1001]; char ans[1001]; int main() { memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); scanf("%s",shu1); scanf("%s",shu2); int n1=strlen(shu1); int n2=strlen(shu2); int js1=1,js2=1; for(int i=n1-1;i>=0;--i) { c1[js1]=shu1[i]-'0'; js1++; } for(int i=n2-1;i>=0;--i) { c2[js2]=shu2[i]-'0'; js2++; } int sum=1; js1--; js2--; while(sum<=js1||sum<=js2) { ans[sum]+=c1[sum]+c2[sum]; if(ans[sum]>=10) { ans[sum]-=10; ans[sum+1]+=1; } sum++; } while(ans[sum]==0&&sum!=1) sum--; for(int i=sum;i>=1;--i) printf("%d",int(ans[i])); return 0; }高精加
高精度減法(洛谷P2142)
題目描述
高精度減法
輸入輸出格式
輸入格式:
兩個整數a,b(第二個可能比第一個大)
輸出格式:
結果(是負數要輸出負號)
輸入輸出樣例
輸入樣例#1:2 1輸出樣例#1:
1
說明
20%數據a,b在long long範圍內
100%數據0<a,b<=10的10000次方
比較麻煩,稍微講一講。
#include<cstdio> #include<cstring> #include<string> using namespace std; int n,k; char shu1_false[10001],shu2_false[10001]; char shu1_true[10001],shu2_true[10001]; char c1[10001],c2[10001]; char ans[10001]; int js1_false=0,js2_false=0; int main() { memset(c1,0,sizeof(c1));//初始化 memset(c2,0,sizeof(c2));//初始化 scanf("%s",shu1_false);//讀入 scanf("%s",shu2_false);//讀入 int n1_false=strlen(shu1_false),n2_false=strlen(shu2_false);//計算兩個串的長度。 if(n1_false==1&&shu1_false[0]=='0') { js1_false=1; shu1_true[0]='0'; } if(n2_false==1&&shu2_false[0]=='0') { js2_false=1; shu2_true[0]='0'; }//判斷有數為0的情況。 bool bz1=0,bz2=0; for(int i=0;i<n1_false;++i) { if(bz1==0&&shu1_false[i]!='0') bz1=1; if(bz1==1) { shu1_true[js1_false]=shu1_false[i]; js1_false++; } } js1_false--; for(int i=0;i<n2_false;++i) { if(bz2==0&&shu2_false[i]!='0') bz2=1; if(bz2==1) { shu2_true[js2_false]=shu2_false[i]; js2_false++; } } js2_false--;//將兩個串去除前導零並記下來。 int js1_true=1,js2_true=1; int n1_true=strlen(shu1_true),n2_true=strlen(shu2_true); if(n2_true>n1_true||(n2_true==n1_true&&strcmp(shu1_true,shu2_true)<0))//判斷兩個串誰大誰小。 串一<串二時。 { printf("-");//輸出﹣號。 for(int i=js2_false;i>=0;--i) { c1[js1_true]=shu2_true[i]-'0'; js1_true++; } for(int i=js1_false;i>=0;--i) { c2[js2_true]=shu1_true[i]-'0'; js2_true++; }//將第二個串存到c1, 第一個串存到c2 } else//大於的話。 { for(int i=js1_false;i>=0;--i) { c1[js1_true]=shu1_true[i]-'0'; js1_true++; } for(int i=js2_false;i>=0;--i) { c2[js2_true]=shu2_true[i]-'0'; js2_true++; }//將第一個串存到c1, 第二個串存到c2 } js1_true--; js2_true--; int sum=1; while(sum<=js1_true||sum<=js2_true) { if(c1[sum]<c2[sum]) { c1[sum]+=10; c1[sum+1]-=1; }//借一 ans[sum]=c1[sum]-c2[sum]; sum++; }//計算減法。 while(ans[sum]==0&&sum!=1) sum--;//去前導零。 for(int i=sum;i>=1;--i)//輸出答案。 printf("%d",int(ans[i])); return 0; }高精度減法
時隔13天,整整13天,我又來更新了!
P1303 A*B Problem
題目描述
求兩數的積。
輸入輸出格式
輸入格式:
兩行,兩個數。
輸出格式:
積
輸入輸出樣例
輸入樣例#1:1 2輸出樣例#1:
2
說明
每個數字不超過10^2000,需用高精
Code(沒處理負數):
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<cstdlib> using namespace std; char shu1[2020],shu2[2020]; char c1[2020],c2[2020]; char ans[5000]; int len=0; int main() { memset(ans,0,sizeof(ans)); int js1=1,js2=1; cin>>shu1>>shu2; int len1=strlen(shu1),len2=strlen(shu2); for(int i=len1-1;i>=0;--i) c1[js1++]=shu1[i]-'0'; while(js1>1&&c1[js1]==0) js1--; for(int i=len2-1;i>=0;--i) c2[js2++]=shu2[i]-'0'; while(js2>1&&c2[js2]==0) js2--; for(int i=1;i<=js1;++i) { int jw=0; for(int j=1;j<=js2;++j) { len=j+i-1; ans[j+i-1]+=c1[i]*c2[j]; jw=ans[j+i-1]/10; ans[j+i-1]%=10; if(jw>0) { ans[j+i]+=jw; jw=0; if(j+i>len) len=j+i; } } } while(len>1&&ans[len]==0) len--; for(int i=len;i>=1;--i) cout<<int(ans[i]); return 0; }高精乘