[ACW]791~794高精度
tips:
1.倒序存储
2.进位、借位处理t
3.去除前导零
4.c++11新语法auto
5.A4A3A2A1A0(自然语言与代码存储相结合)
6.压位处理?
//加法
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
vector<int> add(vector<int> &A, vector<int> &B){
vector<int> C;
int t=0;//进位
for(int i=0;i<A.size()||i<B.size(); i++){
if(i<A.size()) t+=A[i];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(1);
return C;
}
int main(){
string a,b;
vector<int> A,B;
cin>>a>>b;//a="123456"
for(int i=a.size()-1; i>=0; i--) A.push_back(a[i]-'0'); //A=[6,5,4,3,2,1]
for(int i=b.size()-1; i>=0; i--) B.push_back(b[i]-'0');
auto C= add(A,B);//c++11标准,for循环可以范围遍历;一个变量冒号一个list或容器。
for(int i=C.size()-1; i>=0; i--) printf("%d",C[i]);//个位数先放进去
return 0;
}
//Ai-Bi-t
//保证A大于等于B
//A有多少位,C有多少位;减法要处理前导零
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
//判断是否有A >= B
bool cmp(vector<int> &A, vector<int> &B){
if(A.size() != B.size()) return A.size()>B.size();
for(int i=A.size()-1; i>=0; i--)
if(A[i] != B[i])
return A[i]>=B[i];
return true;
}
//C=A-B;
vector<int> sub(vector<int> &A, vector<int> &B){
vector<int> C;
for(int i=0,t=0; i<A.size(); i++){
t=A[i]-t;
if(i<B.size()) t-=B[i];
C.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(C.size()>1 && C.back()==0) C.pop_back();
return C;
}
int main(){
string a,b;
vector<int> A,B;
cin>>a>>b;//a="123456"
for(int i=a.size()-1; i>=0; i--) A.push_back(a[i]-'0'); //A=[6,5,4,3,2,1]
for(int i=b.size()-1; i>=0; i--) B.push_back(b[i]-'0');
if(cmp(A,B)){
auto C= sub(A,B);//c++11标准,for循环可以范围遍历;一个变量冒号一个list或容器。
for(int i=C.size()-1; i>=0; i--) printf("%d",C[i]);//个位数先放进去
}
else{
auto C= sub(B,A);//c++11标准,for循环可以范围遍历;一个变量冒号一个list或容器。
printf("-");
for(int i=C.size()-1; i>=0; i--) printf("%d",C[i]);//个位数先放进去
}
return 0;
}
ps:
1.记忆算法思路,落实到代码。
2.自然理解讨论,写代码时转化成语言语法。