// 1168 大整数加法
#include <bits/stdc++.h>
using namespace std;
string delete0(string str){
int i=0;
while(i<str.size()-1&&str[i]=='0') i++;
return str.substr(i);
}
string add(string n1,string n2){
reverse(n1.begin(),n1.end());
reverse(n2.begin(),n2.end());
while(n1.size()!=n2.size())
n1.size()>n2.size()?n2.push_back('0'):n1.push_back('0');
string ans="";
int jw=0;
for(int i=0;i<n1.size();i++){
int sum=n1[i]+n2[i]-96+jw;
ans.push_back(sum%10+48);
jw=sum/10;
}
if(jw) ans.push_back(jw+48);
reverse(ans.begin(),ans.end());
return ans;
}
int main() {
string n1,n2;
cin>>n1>>n2;
n1=delete0(n1);
n2=delete0(n2);
cout<<add(n1,n2);
return 0;
}
// 1169 大整数减法
#include <bits/stdc++.h>
using namespace std;
string sub(string n1,string n2){
reverse(n1.begin(),n1.end());
reverse(n2.begin(),n2.end());
while(n2.size()<n1.size()) n2.push_back('0');
string ans;
int jw=0;
for(int i=0;i<n1.size();i++){
int diff=n1[i]-n2[i]-jw;
if(diff<0){
diff+=10;
jw=1;
}
else jw=0;
ans.push_back(diff+48);
}
while(ans.back()=='0'&&ans.size()>1) ans.pop_back();
reverse(ans.begin(),ans.end());
return ans;
}
int main(){
string n1,n2;
cin>>n1>>n2;
cout<<sub(n1,n2);
return 0;
}
大整数乘法
1、字符串存储
2、倒序
3、双层循环(每个数字都需要跟另一个数的各个数字进行乘法)
4、每乘一次,对应位置需要累加
for(int i=0;){
for(int j=0;){
c[i+j]+=a[i]*b[j]+jw;
jw=c[i+j]/10;
c[i+j]%=10;
}
c[i+j+1]+=jw;
}
string mul(string n1,string n2){
vector<int> num(n1.size()+n2.size()+1,0);
for(int i=n1.size()-1;i>=0;i--){
for(int j=n2.size()-1;j>=0;j--){
int m=(n1[i]-48)*(n2[j]-48)+num[i+j];
num[i+j+1]=m%10;
num[i+j]=m/10;
}
}
string ans="";
int i=0;
while(num[i]==0&&i!=n1.size()+n2.size()-1) i++;
for(;i<=n1.size()+n2.size()-1;i++) ans.push_back(num[i]+48);
return ans;
}
(责任编辑:admin) |