复习一下高精度~~
1.高精度加法
#includeusing namespace std; const int maxn=100010; int a[maxn],b[maxn],w[maxn]; void File_in_and_out(); void scan_num1_and_num2(); void Plus(); void print_ans(); int main() { //File_in_and_out(); scan_num1_and_num2(); Plus(); print_ans(); return 0; } void File_in_and_out() { freopen("plus.in","r",stdin); freopen("plus.out","w",stdout); } void scan_num1_and_num2() { string num1,num2; cin>>num1; cin>>num2; a[0]=num1.length(); b[0]=num2.length(); for(int i=0;i<=a[0]-1;i++) { a[a[0]-i]=num1[i]-'0'; } for(int i=0;i<=b[0]-1;i++) { b[b[0]-i]=num2[i]-'0'; } } void Plus() { int ex=0; for(int i=1;i<=a[0] || i<=b[0];i++) { w[i]=(a[i]+b[i]+ex)%10; ex=(a[i]+b[i]+ex)/10; w[0]++; } if(ex!=0) { w[++w[0]]=ex; } } void print_ans() { for(int i=w[0];i>=1;i--) { printf("%d",w[i]); } }
对比一下Python的
a=input() b=input() a=int(a) b=int(b) print(a+b)
(Python真好用 )
2.高精度减法
#includeusing namespace std; int sign=0; string a,b; const int maxn=100010; int num1[maxn],num2[maxn],ans[maxn]; void scan(); void reduce(); void print(); int main() { scan(); reduce(); print(); return 0; } void scan() { cin>>a; cin>>b; num1[0]=a.length(); num2[0]=b.length(); if(num1[0] 1) { ans[0]--; } } void print() { if(sign==-1) printf("-"); for(int i=ans[0];i>=1;i--) { printf("%d",ans[i]); } }
3.高精度乘法
#includeusing namespace std; const int maxn=20010; int num1[maxn],num2[maxn],ans[maxn]; void File_Input_and_Output(); void scan(); void multiplication(); void print(); int main() { // File_Input_and_Output(); // int n; // scanf("%d",&n); // for(int i=1;i<=n;i++) // { memset(num1,0,sizeof(num1)); memset(num2,0,sizeof(num2)); memset(ans,0,sizeof(ans)); scan(); multiplication(); print(); // } return 0; } void File_Input_and_Output() { freopen("Mutiplication.in","r",stdin); freopen("Mutiplication.out","w",stdout); } void scan() { string a,b; cin>>a; cin>>b; num1[0]=a.length(); num2[0]=b.length(); for(int i=0;i<=num1[0]-1;i++) num1[num1[0]-i]=a[i]-'0'; for(int i=0;i<=num2[0]-1;i++) num2[num2[0]-i]=b[i]-'0'; } void multiplication() { for(int i=1;i<=num1[0];i++) { int x=0; for(int j=1;j<=num2[0];j++) { ans[i+j-1]=ans[i+j-1]+x+num1[i]*num2[j]; x=ans[i+j-1]/10; ans[i+j-1]=ans[i+j-1]%10; } ans[i+num2[0]]=x; ans[0]=num1[0]+num2[0]; while(ans[ans[0]]==0 && ans[0]>1) { ans[0]--; } } } void print() { for(int i=ans[0];i>=1;i--) { printf("%d",ans[i]); } printf("n"); }
4.高精度除法
(1).高精度除以单精度(高精度运算里最短的代码)
#include#include using namespace std; string a,c; int b,i,d; int main() { cin >> a >> b; for (;i (2).高精度除以高精度
C++的还不会(学会了补上不太可能会去学),拿Python的凑一下~~a , b = int(input()),int(input()) print (a // b)(
Python真香)5.重定义运算符
我写的这个只适用于输入是低精度(你也可以自己把输入的运算符也一重载),然后结果是高(低)精度的输出,多次进行高精度运算会比较方便。
(注意数据的位数,我只开了500位,而且只写了乘法和除法的加法和减法就随缘吧)
P1045 [NOIP2003 普及组] 麦森数
P1080 [NOIP2012 提高组] 国王游戏
这两个题可以试试水// ============================================================ // #pragma GCC optimize(2) // #pragma GCC optimize(3,"Ofast","inline") // ============================================================ #include#include #include #include #include #include #include #include #include #include #include #include #include



