题解
2023-07-30 19:38:01
发布于:浙江
7阅读
0回复
0点赞
很简单
#include <bits/stdc++.h>
using namespace std;
string multiply(string a, string b) {
//构造一个答案 c 字符串,长度是 a 与 b 长度之和,全部初始化为 ASCII 0,方便做乘法运算
string c(a.length() + b.length(), 0);
// 需要先将 a, b 翻转,乘法规律
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (int i = 0; i < a.length(); i++) {
for (int j = 0; j < b.length(); j++) {
int k = i + j; // 目标下标
c[k] += (a[i] - '0') * (b[j] - '0'); // 计算乘积
c[k + 1] += c[k] / 10; // 进位
c[k] %= 10; // 本位剩下的数字
}
}
reverse(c.begin(), c.end());
for (int i = 0; i < c.length(); i++) {
c[i] += '0';
}
while (c.length() > 1 && c.front() == '0') c.erase(c.begin());
return c;
}
// 判断较大的数字是否是 b
bool check(const string &a, const string &b) {
// a 数位长度小于 b,整数 a 小于 b
if (a.length() < b.length()) return true;
else if (a.length() > b.length()) return false;
// 否则比较字典序即可
return a < b;
}
string subtraction(string a, string b) {
//构造一个答案 c 字符串,长度是 a 与 b 最长的,全部初始化为 ASCII 0,方便做减法运算
string c(max(a.length(), b.length()), 0);
// 先将较大的数字放在 a 字符串中,标记 sign 作为判断负数的依据
bool sign = false;
if (check(a, b)) {
sign = true;
a.swap(b);
}
// i 表示 a 整数的数位,j 表示 b 整数的数位,均从个位开始相减
for (int i = a.length() - 1, j = b.length() - 1; i >= 0; i--, j--) {
c[i] += (a[i] - '0') - (j >= 0 ? b[j] - '0' : 0);
if (c[i] < 0) { // 需要借位
c[i - 1] = -1;
c[i] += 10;
}
}
// 将所有的整数转换为字符数字
for (int i = 0; i < c.length(); i++) {
c[i] += '0';
}
// 删除前置 0
while (c.length() > 1 && c.front() == '0') c.erase(c.begin());
if (sign) return "-" + c;
return c;
}
int main() {
int n;
cin >> n;
string base = "2", res = "1";
for (int i = 1; i <= n; i++) {
res = multiply(res, base);
}
res = subtraction(res, "1");
cout << multiply(res, base);
return 0;
}
这里空空如也
有帮助,赞一个