代码模板整理(2):高精度四则运算
严谨的代码模板整理
高精度四则运算
1.高精度
1-1 高精度加法
首先,需要3个数组,\(a[ i]\) \(b[i]\) 分别储存输入的\(a,b\)(\(a,b\)以字符串读入)
然后,从末尾开始相加,逢十进一,并储存到\(c[i]\)之中
最后,倒序输出即可
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[10000], b[10000], c[10000];//分别储存
string A, B;
int main(){
cin>>A>>B;
int q=1, w=1;
int len=max(A.size(), B.size());
for(int i=A.size()-1;i>=0;i--){
a[q]=A[i]-'0';
q++;
}
for(int i=B.size()-1;i>=0;i--){
b[w]=B[i]-'0';
w++;
}//分别处理
for(int i=1;i<=max(q,w);i++){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]%=10;
}//计算
if(c[len+1]){
len++;
}
for(int i=len;i>=1;i--){
cout<<c[i];
}//输出
return 0;
}
1-2 高精度减法
具体思想和高精度加法相似
按照减法规则模拟即可
#include<bits/stdc++.h>
using namespace std;
int A[100000], B[100000], C[100000];
string a, b;
int main(){
cin>>a>>b;
int q=1, w=1;
if(a.size()<b.size()){
swap(a, b);
C[0]=-1;
}else if(a.size()==b.size()){
if(a<b){
swap(a, b);
C[0]=-1;
}
}
int len=a.size();
for(int i=a.size()-1;i>=0;i--){
A[q]=a[i]-'0';
q++;
}
for(int i=b.size()-1;i>=0;i--){
B[w]=b[i]-'0';
w++;
}
for(int i=1;i<=len;i++){
C[i]+=A[i]-B[i];
if(C[i]<0){
C[i+1]-=1;
C[i]+=10;
}
}
if(C[0]==-1){
cout<<"-";
}
int count=0;
for(int i=len;i>=1;i--){
if(C[i]==0){
count++;
}
if(count==len){
cout<<0;
return 0;
}
}
for(int i=len;i>=1;i--){
cout<<C[i];
}
return 0;
}
1-3 高精度乘法
这个比较特殊,需要计算贡献
其计算方法是
\[c[i+j]=c[i+j]+A[i] * B[j]
\]
然后就是基操
#include<bits/stdc++.h>
using namespace std;
long long c[30000]={0};
long long A[10000], B[10000];
int main() {
string a, b;
cin>>a>>b;
int q=0, w=0;
for(int i=a.size()-1; i>=0; i--) {
A[w]=a[i]-'0';
w++;
}
for(int i=b.size()-1; i>=0; i--) {
B[q]=b[i]-'0';
q++;
}
for(int i=0; i<=w; i++) {
for(int j=0; j<=q; j++) {
c[i+j]+=A[i]*B[j];//计算贡献
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
int m=a.size()+b.size();
for(; !c[m]&&m>=1;) {
m--;
}
for(int i=m; i>=0; i--) {
cout<<c[i];
}
return 0;
}
1-4 高精度除法*
这个不解释(因为不会),先放个代码
高精度\(/\)单精度
string mul(string x,string y) {
int a[maxn],b[maxn],c[maxn];
string ans;
int lena=x.length(),lenb=y.length(),len=lena+lenb-1;
for(int i=0; i<lena; i++) a[lena-i-1]=x[i]-'0';
for(int i=0; i<lenb; i++) b[lenb-i-1]=y[i]-'0';
for(int i=0; i<lena; i++)
for(int j=0; j<lenb; j++)
c[i+j]+=a[i]*b[j];
int temp=0;
for(int i=0; i<len; i++) {
c[i]+=temp;
temp=c[i]/10;
c[i]%=10;
}
while(temp) c[len++]=temp%10,temp/=10;
while(!c[len-1] && len>1) len--;
for(int i=len-1; i>=0; i--) ans+=c[i]+'0';
return ans;
}
作者:JX-weak
-------------------------------------------
个性签名:そんなに形に拘らないの、大切なのは心よ
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!

浙公网安备 33010602011771号