这四道题灰常简单(真是保姆级别注释)
高精度加
思路:
首先这么长的数字 long long 都装不下,所以只能用数组存,然后一位一位相加,最后倒序输出
废话不多说,下面直接放四道题的思路点拨以及AC代码
AC代码(加法):
#include<bits/stdc++.h>//万能头,懂得都懂
using namespace std;
string s1,s2;
int a[300],b[300],c[300];//定义数组
int main(){
cin>>s1>>s2;
int len1=s1.size();//记录字符串长度
int len2=s2.size();
for(int i=0;i<len1;i++){
a[len1-i]=s1[i]-'0';//存入数组A
}
for(int i=0;i<len2;i++){
b[len2-i]=s2[i]-'0';//存入数组B
}
int len=max(len1,len2)+1;//记录哪个数字长,因为加法最多进一位,所以在数位最多的数上再加一(即便没进位也没太大关系)
for(int i=1;i<=len;i++){//单个数位进位计算
c[i]+=a[i]+b[i];//c[i]记录单个数位总和
c[i+1]+=c[i]/10;//防范单个数位进位,如果>=10再%10加在c[i+1]上面
c[i]%=10;//再把十位%掉
}
while(c[len]==0 && len>1)len--;//去除前导零(由于是倒序,正序过来就是后导零)
for(int i=len;i>=1;i--)cout<<c[i];//输出c数组(总和)
return 0;
}//完美结束
高精度减
思路:
思路跟加法差不多,只是把进位改成退位,再加个特判
AC代码(减法):
#include<bits/stdc++.h>//万能头,懂得都懂
using namespace std;
int a[300],b[300],c[300];//定义数组
string s1,s2;
int main(){
cin>>s1>>s2;
if(s1.size()<s2.size() or s1.size()==s2.size() and s1<s2){//特判,本题没有负数,所以只能大数减小数
swap(s1,s2);
cout<<"-";
}
int len1=s1.size();//记录字符串长度
int len2=s2.size();
for(int i=0;i<len1;i++){
a[len1-i]=s1[i]-'0';//存入数组A
}
for(int i=0;i<len2;i++){
b[len2-i]=s2[i]-'0';//存入数组B
}
int len=max(len1,len2);//记录哪个数字长,减法不会进位,只会退位
for(int i=1;i<=len;i++){//单个数位退位计算
if(a[i]<b[i]){//这里判断退位情况
a[i+1]--;//向上借位
a[i]+=10;//a[i]加10再减b[i]
}
c[i]+=a[i]-b[i];//不退位,直接减
}
while(c[len]==0 and len>1) len--;//去除前导零(由于是倒序,正序过来就是后导零)
for(int i=len;i>=1;i--) cout<<c[i]; //输出c数组(差)
return 0;
}//完美结束
高精度乘
思路:
其实高精度思路都差不多,乘法最恶心,因为处理进位不知道要进几位
#include<bits/stdc++.h>//万能头,懂得都懂
using namespace std;
const int N=500;
int a[N],b[N],c[N];//由于数据可能很大,所以开const
string s1,s2;
int main(){
cin>>s1>>s2;
int len1=s1.size(),len2=s2.size();//记录字符串长度
for(int i=0;i<len1;i++){
a[len1-i]=s1[i]-'0';//存入数组A
}
for(int i=0;i<len2;i++){
b[len2-i]=s2[i]-'0';//存入数组B
}
int len=len1+len2;//相乘最多位数为两个乘数相加
for(int i=1;i<=len1;i++){//单个数位计算
for(int j=1;j<=len2;j++){//嵌套循环
c[i+j-1]+=a[i]*b[i];//如果进位就依次往后加
c[i+j]+=c[i+j-1]/10;//把十位去掉
c[i+j-1]%=10;//保留各位
}
}
while(c[len]==0 && len>1) len--;//去除前导零(由于是倒序,正序过来就是后导零)
for(int i=len;i>=1;i--){
cout<<c[i];//输出c数组(乘积)
}
return 0;
}//完美结束
高精度除
思路:
前面三道都是中等,虽然这道是困难,但代码都挺简单的(只是理解比较难)
#include <bits/stdc++.h>//万能头,懂得都懂
using namespace std;
string s1;
int a[300],b,c[300]; //定义数组,b是单精度
int main(){
cin>>s1>>b;
int len1=s1.size();
for(int i=0;i<s1.size();i++){
a[i+1]=s1[i]-'0';//记录字符串长度
}
int len=len1;//len1赋值给len
int x=0;//定义x记录数值
for(int i=1;i<=len;i++){//单个数位计算
x=(x*10+a[i]);//
c[i]=x/b;
x=x%b;//%b求余
}
int t=1;
while(c[t]==0 && t<len) t++;
for(int i=t;i<=len;i++){
cout<<c[i]; //输出c数组(商)
}
return 0;
}//完美结束
留个关注:)