处理字符串输入模板
string input;
getline(cin, input);
int nodeValue = 0;
vector<int> data;
for (int i=0; i<input.length(); i++){
char tmp = input[i];
if (charIsDigit(tmp)){
nodeValue = nodeValue * 10 + charToInt(tmp);
}else{
if (nodeValue != 0){
data.push_back(nodeValue);
nodeValue = 0;
}else if(tmp == 'n'){
data.push_back(-1);
}
}
}
data.push_back(nodeValue);
DP问题处理下标负数情况
vector<map<int,int> > dp(n+1); //v可以为负值,考虑用 vector<map<int,int>>进行解决
1.高精度
输入输出模板
int main()
{
//stin,stout一样
string s1, s2;
cin >> s1 >> s2;
vector<int> a, b;
for(int i = s1.size() - 1; i >= 0; i--) a.push_back(s1[i] - '0');
for(int i = s2.size() - 1; i >= 0; i--) b.push_back(s2[i] - '0');
auto c = add(a, b);
for(int i = c.size() - 1; i >= 0; i--) cout << c[i];
return 0;
}
去除前导零
//去除前导零
while(c.size() > 1 && c.back() == 0) c.pop_back();
1)加法
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int> &a, vector<int> &b)
{
if(a.size() < b.size()) return add(b, a);
int t = 0;
vector<int> c;
for(int i = 0; i < a.size(); i++)
{
t += a[i];
if(i < b.size()) t += b[i];
c.push_back(t % 10);
t /= 10;
}
//最后的进位
if(t) c.push_back(t);
return c;
}
int main()
{
//stin,stout一样
string s1, s2;
cin >> s1 >> s2;
vector<int> a, b;
for(int i = s1.size() - 1; i >= 0; i--) a.push_back(s1[i] - '0');
for(int i = s2.size() - 1; i >= 0; i--) b.push_back(s2[i] - '0');
auto c = add(a, b);
for(int i = c.size() - 1; i >= 0; i--) cout << c[i];
return 0;
}
2)减法
#include<iostream>
#include<vector>
using namespace std;
bool cmp(vector<int> &a, vector<int> &b)
{
if(a.size() != b.size())
return a.size() > b.size();
else{
for(int i = a.size() - 1; i >= 0; i--)
if(a[i] != b[i])
return a[i] > b[i];
}
return true;
}
vector<int> sub(vector<int> &a, vector<int> &b)
{
int t = 0;
vector<int> c;
for(int i = 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 s1, s2;
vector<int> a, b, c;
cin >> s1 >> s2;
for (int i = s1.size() - 1; i >= 0; i--) a.push_back(s1[i] - '0');
for (int i = s2.size() - 1; i >= 0; i--) b.push_back(s2[i] - '0');
if(cmp(a, b)) c = sub(a, b);
else{
cout << '-';
c = sub(b, a);
}
for(int i = c.size() - 1; i >= 0; i--) cout << c[i];
return 0;
}
3)乘法
#include<iostream>
#include <vector>
using namespace std;
vector<int> mul(vector<int> &a, int b)
{
vector<int> c;
int t = 0;
for(int i = 0; i < a.size(); i++)
{
t = a[i] * b + t;
c.push_back(t % 10);
t /= 10;
}
if(t) c.push_back(t);
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
int main()
{
vector<int> a, c;
string s1;
int b;
cin >> s1 >> b;
for(int i = s1.size() - 1; i >= 0; i--) a.push_back(s1[i] - '0');
c = mul(a, b);
for(int i = c.size() - 1; i >= 0; i--) cout << c[i];
return 0;
}
4)除法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> div(vector<int> &a, int b, int &r)
{
vector<int> c;
for(int i = a.size() - 1; i >= 0; i--) //与 加减乘 不一样
{
r = r * 10 + a[i];
c.push_back(r / b);
r %= b;
}
reverse(c.begin(), c.end()); //方便模板
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
int main()
{
string s1;
int b, r = 0;
cin >> s1 >> b;
vector<int> a, c;
for(int i = s1.size() - 1; i >= 0; i--) a.push_back(s1[i]-'0');
c = div(a, b, r);
for(int i = c.size() - 1; i >= 0; i--) cout << c[i];
cout << endl << r << endl;
return 0;
}