高精度计算
本质:由字符串转换为数字并存在数字数组中,计算方式参照竖式计算
步骤:1.输入字符串,转换为数字储存在数组中(这里是加法)
#include<bits/stdc++.h>//仅正数
using namespace std;
int a[510],b[510],c[510];
int main(){
string A,B;
cin>>A>>B;
for(int i=A.length()-1,j=1;i>=0;i--,j++){
a[j]=A[i]-'0';
}
for(int i=B.length()-1,j=1;i>=0;i--,j++){
b[j]=B[i]-'0';
}//1.字符串转为数组(逆序)
(负数计算还要多考虑)
接下来,应该是通用的len,但是for内内容因计算符号有差别
int len=max(A.length(),B.length());//2.计算A,B最高位数
for(int i=1;i<=len;i++){//(类似竖式计算)
c[i]+=a[i]+b[i];
c[i+1]+=c[i]/10;//进位
c[i]%=10;//剩下
}
比如减法的就不一样
int lenmax=max(A.length(),B.length());
for(int i=1;i<=lenmax;i++){
a[i+1]--;
a[i]+=10;
c[i]+=a[i]-b[i];
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
减法还要注意减数大于被减数的情况
3.输出c。这里需要知道c的位数,建议可以使用vector,方便
if(c[len+1]) len++; //3.检查c中位数是否比a,b中最大的更大一位
for(int i=len;i>0;i--){
cout<<c[i];
}//4.输出c
return 0;
}
4.总结:就是要考虑足细节
比如:减法nt lenc=lenmax;//注意c位数范围
for(int i=lenmax;i>1;i--){//i>0错误,a=b时不输出 这里一定注意
if(c[i]==0) lenc--;
else break;
}//c的位数
for(int i=lenc;i>0;i--){
cout<<c[i];
}
return 0;
再比如这个乘法
#include<bits/stdc++.h>
using namespace std;
vector<int>a,b,c;
int main(){
string A,B;
cin>>A>>B;
for(int i=A.length()-1;i>=0;i--){
a.push_back(A[i]-'0');
}
for(int i=B.length()-1;i>=0;i--){
b.push_back(B[i]-'0');
}
int len=max(A.length(),B.length());
for(int i=0;i<len;i++){
c.push_back(a[i]*b[i]);
c.push_back(c[i]/10);
c[i]%=10;
}
int lenc=c.size();
if(c[lenc-1]==0) lenc--;
for(int i=lenc-1;i>=0;i--){
cout<<c[i];
}
return 0;
}
不知问题所在,有些数能算有些不能,然后交给洛谷是0分(笑)
乘法和除法还没敲过,慢慢下来理解罢