关于高精度计算
当遇到数值超过long long范围的数字要进行四则运算的时候,就要运用高精度来解决。
高精度的计算其实就是把我们现实中手算的过程搬到程序上,让程序来替我们计算就行了。
1.加法
#include<bits/stdc++.h> using namespace std; const int N = 505; char a1[N],b1[N]; int a[N],b[N],c[N]; int main() { scanf("%s %s",a1,b1); int la=strlen(a1),lb=strlen(b1); //要从个位加起,所以先把各位数倒着存放 for(int i=0;i<la;++i)a[la-i-1]=(int)a1[i]-'0'; for(int i=0;i<lb;++i)b[lb-i-1]=(int)b1[i]-'0'; int len=0,x=0;//x用来存储进位 while(len<=la||len<=lb) { c[len]=a[len]+b[len]+x; x=c[len]/10; c[len]%=10; len++; } if(c[len-1]==0)len--; for(int i=len-1;i>=0;--i)cout<<c[i]; cout<<endl; return 0; }
2.减法
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=10090; string a1,b1,c1; int a[N],b[N],c[N]; int main() { cin>>a1>>b1; if(a1.size()<b1.size()|| (a1.size()==b1.size()&&a1<b1))//要保证是大减小,否则交换顺序,输出符号 { c1=a1; a1=b1; b1=c1; cout<<"-"; } int la=a1.size(),lb=b1.size(); //和加法一样,从个位开始减起 for(int i=0;i<la;++i)a[la-i-1]=(int)a1[i]-'0'; for(int i=0;i<lb;++i)b[lb-i-1]=(int)b1[i]-'0'; int len=0; while(len<la) { c[len]=a[len]-b[len]; if(c[len]<0)//小于零向前借一位 { c[len]+=10; a[len+1]--; } len++; } for(int i=len;i>0;--i){//去掉前导0 if(c[len]==0)len--; else break; } for(int i=len;i>=0;--i)cout<<c[i]; }
3.乘法
#include<bits/stdc++.h> using namespace std; const int N = 2007; string a1,b1; int a[N],b[N],c[N]; int main() { cin>>a1>>b1; int la=a1.size(),lb=b1.size(); int len=la+lb-1; for(int i=0;i<la;++i)a[la-i-1]=(int)a1[i]-'0'; for(int i=0;i<lb;++i)b[lb-i-1]=(int)b1[i]-'0'; //一位一位的乘 for(int i=0;i<la;++i) { for(int j=0;j<lb;++j) { c[i+j]+=a[i]*b[j]; c[i+j+1]+=c[i+j]/10; c[i+j]%=10; } } //去掉前导0 for(int i=len;i>0;--i) { if(c[len]==0)len--; } for(int i=len;i>=0;--i)cout<<c[i]; return 0; }
4.除法
*仅适用高精度除于低精度
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N = 1e3; char a1[N],c1[N]; int a[N],c[N],b; int main() { scanf("%s",a1); cin>>b; int len=strlen(a1); for(int i=0;i<len;i++) { a[i+1]=a1[i]-48; } int x=0;//记录余数 for(int i=1;i<=len;i++) { c[i]=(x*10+a[i])/b; x=(x*10+a[i])%b; } int lenc=1; while(c[lenc]==0&&lenc<len)lenc++;//去掉前导0 for(int i=lenc;i<=len;i++)cout<<c[i]; return 0; }

浙公网安备 33010602011771号