目录
思路:
1、将字符串逆序
2、较短的字符串补0
3、再判断是否要进位
1、高精度加法
法一:
#include<iostream>
using namespace std;
string str1,str2;
int n1[300],n2[300],n3[300],len;
void f(){
for(int i=0;i<len;i++){
n3[i]+=n1[i]+n2[i]; //相同位置相加,并加上上一位的进位
n3[i+1]=n3[i]/10; //进位
n3[i]%=10; //进完位后,取余
}
if(n3[len]){
cout<<n3[len]; //最高位len的下一位,有没有被进位
}
for(int i=len-1;i>=0;i--){//逆序输出
cout<<n3[i];
}
}
int main(){
cin>>str1>>str2; //输出连个数字字符串
int t=str1.length()-1; //str1的高位下标
for(int i=0;i<str1.length();i++){ //逆序
n1[i]=str1[t]-'0'; //并把字符转数字
t--;
}
t=str2.length()-1;//str2的高位下标
for(int i=0;i<str2.length();i++){//逆序
n2[i]=str2[t]-'0'; //并把字符转数字
t--;
}
if(str1.length()>=str2.length()){ //str1比较长
len=str1.length(); //记录最长的长度
f();
}else{ //str2比较长
len=str2.length();
f();//调用函数,长加短
}
}
法二:
#include<iostream>
#include<algorithm>
using namespace std;
//加法
string add(string a,string b){
string ans; //结果
int len=max(a.size(),b.size());
reverse(a.begin(),a.end()); //翻转
reverse(b.begin(),b.end()); //翻转
for(int i=a.size();i<len;i++)a=a+'0';
for(int i=b.size();i<len;i++)b=b+'0';
int x=0;//用于进位
for(int i=0;i<len;i++){
x=x+(a[i]-'0')+(b[i]-'0');
ans+=x%10+'0';
x=x/10;
}
if(x>0)ans+='1';
reverse(ans.begin(),ans.end());
return ans;
}
int main(){
string a,b;
cin>>a>>b;
cout<<add(a,b);
}
2.高精度减法
①两个都是正整数:
#include<bits/stdc++.h>
using namespace std;
string n,m;
//大数 减小
string add(string a,string b){
string ans;
int x=0;
//先对位 颠倒字符串顺序
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
//补 0 这两个加数可能位数不同
int len=max(a.size(),b.size());
for(int i=a.size();i<len;i++)a=a+'0';
for(int i=b.size();i<len;i++)b=b+'0';
//核心内容 模拟竖式运算
for(int i=0;i<len;i++){
a[i+1]-=1; //不管够不够都借一位
x=x + (a[i]-'0') - (b[i]-'0') + 10;
ans+=x%10+'0'; //拼接
x=x/10;
}
reverse(ans.begin(),ans.end());
while(ans[0]=='0'&&len>1)ans.erase(ans.begin()),len--;//去前置 0
//加法 就要考虑最后一个进位
//减法 就要考虑最后删掉前置 0
return ans;
}
int main(){
cin>>n>>m;
if(n.length()>=m.length()){ //n较大
cout<<add(n,m);
}else{
cout<<"-"<<add(m,n); //m较大,要加负数
}
return 0;
}
-
3、高精度乘法
-
#include<bits/stdc++.h> using namespace std; string mul(string a,string b){ int c[10001]= {};//为了方便记录过程的结果 string ans;//最后输出的答案 //模拟竖式乘法的过程,从低位开始相乘,所以要将两个数倒置 reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); //因为一共需要计算 a.size()*b.size()次;所以需要循环嵌套遍历每一个数 for(int i = 0; i < a.size(); i++) for(int j = 0 ; j < b.size(); j++){ //然后是关键的模拟竖式运算的过程,错位相加,以及进位 c[i+j] += (a[i]-'0')*(b[j]-'0');//直接对应位数相乘 c[i+j+1] += c[i+j]/10;//有无进位 c[i+j] %= 10;//保留当前个位数 } //两个非零因数相乘,积的位数要么是两个因数位数之和(如 9*9), //要么是两个因数位数之和-1(如 9*1) int len=a.size()+b.size(); //检查最高位是否为 0 ,如果为 0 ,退一位, //while 循环可以保证即使因数是 0 也能输出正确的结果而不输出多余前导 0 while(c[len]==0&&len>0)len--; for(int i = len; i>=0; i--)ans+=c[i]+'0'; return ans; } int main(){ string s1,s2; cin>>s1>>s2; cout<<mul(s1,s2); return 0; }
-
4、高精度除法
-
高精度÷低精度
-
#include<iostream> using namespace std; string a; int b; string chu(string a,int b){ string ans; int k=0; for(int i=0;i<=a.size()-1;i++){ ans+=(k*10+a[i]-'0')/b+'0'; k=(k*10+a[i]-'0')%b; } while(ans[0]=='0'&&ans.size()>1){ //去零 ans.erase(ans.begin()); } return ans; } int main(){ cin>>a>>b; cout<<chu(a,b); }
-
高精度÷高精度
#include<iostream> #include<algorithm> using namespace std; //加法 string add(string a,string b){ string ans; //结果 int len=max(a.size(),b.size()); reverse(a.begin(),a.end()); //翻转 reverse(b.begin(),b.end()); //翻转 for(int i=a.size();i<len;i++)a=a+'0'; for(int i=b.size();i<len;i++)b=b+'0'; int x=0;//用于进位 for(int i=0;i<len;i++){ x=x+(a[i]-'0')+(b[i]-'0'); ans+=x%10+'0'; x=x/10; } if(x>0)ans+='1'; reverse(ans.begin(),ans.end()); return ans; } //减法 string sub(string a,string b){ string ans; //结果 int len=max(a.size(),b.size()); reverse(a.begin(),a.end()); //翻转 reverse(b.begin(),b.end()); //翻转 for(int i=a.size();i<len;i++)a=a+'0'; //补零 for(int i=b.size();i<len;i++)b=b+'0'; int x=0;//用于进位 for(int i=0;i<len;i++){ x=x+a[i]-b[i]+10; //+10:借位 ans+=x%10+'0'; x=x/10-1; //还一位 } reverse(ans.begin(),ans.end()); while(ans.size()>1&&ans[0]=='0')ans.erase(ans.begin()); return ans; } //大数比较 bool bj(string a, string b){ if(a.size() > b.size()){ return 1; }else if(a.size() < b.size()){ return 0; }else{ if(a>=b) return 1; return 0; } } //高精度除法 string chu2(string a,string b){ string ans; while(bj(a,b)==1){ string b1=b,bei="1",t,k; //b1翻倍后的除数 bei翻了几倍 while(bj(a,b1)){ //翻倍前 t=b1; k=bei; //翻倍 b1=add(b1,b1); bei=add(bei,bei); } a=sub(a,t); //减 ans=add(ans,k);//加 } return ans; } int main(){ string a,b; cin>>a>>b; cout<<chu2(a,b); }