大整数加法
求两个不超过 200200 位的非负整数的和。
输入格式
有两行,每行是一个不超过 200200 位的非负整数,可能有多余的前导 00。
输出格式
一行,即相加后的结果。结果里不能有多余的前导 00,即如果结果是 342342,那么就不能输出为 03420342。
大整数减法
求两个大的正整数相减的差。
输入格式
共 22 行,第 11 行是被减数 aa,第 22 行是减数 b(a > b)b(a>b)。每个大整数不超过 200200 位,不会有多余的前导零。
输出格式
一行,即所求的差。
#include <iostream>
#include "vector"
#include "string"
using namespace std;
// 比较函数。
bool cmpere(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;
}
// 相加函数。
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() || t; ++i) {
if (i < a.size())
t += a[i]; // i小于字符串a的长度时,循环到当前位置i时,i位置上的这个数与t相加,然后得到一个新的t。
//cout << " t: " << t << endl;
if (i < b.size())
t += b[i]; // 这里的t是上面得到的t,然后与b的第i个位置相加得到另一个t。
//cout << " tttt: " << t << endl;
c.push_back(t % 10); // 取余数。
t /= 10; // 取整,用于下一位的运算。
}
return c;
}
// 相减函数。
vector<int> subt(vector<int> &a,vector<int> &b){
vector<int> C;
int t = 0; // 用于借位。
for (int i = 0; i < a.size(); ++i) {
t = a[i] - t; // 左边的t等于a[i] - 0,此时减零是因为初始化为零,后面如果有借位,则应是减一。
if (i < b.size())
t -= b[i]; // 上面得到的t减去对应的b[i],得到另个t值。
C.push_back((t + 10) % 10); // 取t的余数,t为正的时候余数就是自己本身,t为负的时候余数为t+10,此时要向前一位借位。
if (t < 0)
t = 1;
else t = 0; // 判断是否借位,然后确定下个循环的时候是减一还是减零。
}
while (C.size() > 1 && C.back() == 0)
C.pop_back(); //如果c的元素个数大于1,且c的最后一个是元素的值是0,则删除最后一个元素。
return C;
}
int main(){
string A,B;
vector<int> a,b;
cin >> A >> B;
for (int i = 0; i < A.size(); ++i) {
a.push_back(A[i] - '0');
}
for (int i = 0; i < B.size(); ++i) {
b.push_back(B[i] - '0');
}
vector<int> C;
if (cmpere(a,b)){
C = subt(a,b);
} else{
C = subt(b,a);
cout << " ";
}
for (int i = C.size() - 1; i >= 0 ; i--) {
printf("%d",C[i]);
}
return 0;
}
/*int main() {
string A,B; // 输入的两个大数用字符串来表示。
vector<int> a,b;
cin >> A >> B;
for (int i = A.size() - 1; i >= 0; i--) {
a.push_back(A[i] - '0');
}
for (int i = B.size() - 1; i >= 0; i--) {
b.push_back(B[i] - '0');
}
vector<int> C = add(a,b);
for (int i = C.size() - 1; i >= 0; i--) {
printf("%d",C[i]);
}
std::cout << " Hello, World! " << std::endl;
return 0;
}*/
1、首先弄清楚大整数的存储方式,是a[0]存储的是个位,a[1]存储的是十位,a[2]存储的是百位,以此类推,它是倒着存储的。
2、就是要注意vector的操作应用, .back() 是取vector的最后一个元素, .pop.back() 是删除元素。
3、要弄清楚进位和借位的注意点,进位时要前一位加一,借位时时前一位减一。
4、要知道ASCLL码的表示。
5、要删去有效数字前的零。