vector<int> add(vector<int> &A, vector<int> &B){ vector<int> C; // 和 int t = 0; // 1表示进位,0表示不进位 for (int i = 0; i < A.size() || i < B.size(); i++) { if (i < A.size()) t += A[i]; // 把t加上A的倒数第i位 if (i < B.size()) t += B[i]; // 把t加上B的倒数第i位 C.push_back(t % 10); // 存入第i位 t /= 10; // 如果t大于10则进位,此时t/10就是1(反之则为0),为下一位的计算做准备 } if (t) C.push_back(1); // 同理,进位了 return C; } intmain(){ string a, b; // 用string来读入大整数 cin >> a >> b; vector<int> 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'); // 倒序存入数组 auto C = add(A, B); for (int i = C.size()-1; i >= 0; i--) printf("%d", C[i]); // 倒序输出 }
add()函数也可以写成下面这样,(其实也没啥区别,长度差不多):
1 2 3 4 5 6 7 8 9 10 11 12 13 14
vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) returnadd(B, A); vector<int> C; int t = 0; for (int i = 0; i < A.size(); i++) { t += A[i]; if (i < B.size()) t += B[i]; C.push_back(t % 10); c /= 10; } if (t) C.push_back(t); return C; }
// 返回 A > B 是否成立 boolcmp(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]; returntrue; // 每一位都相同,那就是A = B,也返回true }
vector<int> sub(vector<int> &A, vector<int> &B){ vector<int> C; // 差 int t = 0; // 1表示借位,0表示不借位 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); // 计算后将第i位加入数组。加10再模10是因为要考虑借位的情况 if (t < 0) t = 1; // t < 0 即 A[i]减去B[i]后小于0,需要向高一位借位,t = 1 else t = 0; // 否则不需要借位 }
intmain(){ string a, b; cin >> a >> b; vector<int> 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');
if (cmp(A, B)) { // A >= B,直接计算A - B并输出即可 auto C = sub(A, B);
for (int i = C.size()-1; i >= 0; i--) printf("%d", C[i]); } else { // A < B,那么计算A - B实际上是计算B - A,输出时加个负号即可 auto C = sub(B, A);
cout << '-'; for (int i = C.size()-1; i >= 0; i--) printf("%d", C[i]); } return0; }
vector<int> mul(vector<int> &A, int b){ vector<int> C; // 积 int t = 0; // 表示进位 for (int i = 0; i < A.size() || t; i++) { if (i < A.size()) t += A[i]*b; C.push_back(t%10); t /= 10; } while (C.size() > 1 && C.back() == 0) C.pop_back(); return C; }
intmain(){ string a; int b; // 因为乘数B不是大整数,用int存就行。 cin >> a >> b;
vector<int> A; for (int i = a.size()-1; i >= 0; i--) A.push_back(a[i]-'0');
auto C = mul(A, b);
for (int i = C.size()-1; i >= 0; i--) printf("%d", C[i]);
vector<int> div(vector<int> &A, int b, int &r){ // 注意r也是引用传回去的 vector<int> C; // 商 r = 0; // 最高位的余数是0 for (int i = A.size()-1; i >= 0; i--) { r = r*10+A[i]; C.push_back(r/b); r %= b; }