这道题目看似简单 实则十分的难
2025-12-05 20:45:19
发布于:浙江
1阅读
0回复
0点赞
这道题他是十分大的数 数据有10的9次方 比int还要大所以 我们可以用高精的思想来做
#include <iostream>
#include <string>
#include <algorithm> // 用于reverse、max函数
using namespace std;
//高精度加法(两个正数的字符串相加)
string l(string a, string b) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string res;
int carry = 0;
int max_len = max(a.size(), b.size());
// 补0对齐
a.append(max_len - a.size(), '0');
b.append(max_len - b.size(), '0');
for (int i = 0; i < max_len; ++i) {
int digit_a = a[i] - '0';
int digit_b = b[i] - '0';
int sum = digit_a + digit_b + carry;
res.push_back(sum % 10 + '0');
carry = sum / 10;
}
// 处理最后进位
if (carry != 0) {
res.push_back(carry + '0');
}
reverse(res.begin(), res.end());
return res;
}
// 高精度三数相加(兼容正负数)
string ll(int num1, int num2, int num3) {
// 步骤1:分离符号和绝对值
int sign1 = num1 >= 0 ? 1 : -1;
int sign2 = num2 >= 0 ? 1 : -1;
int sign3 = num3 >= 0 ? 1 : -1;
long long abs1 = abs((long long)num1);
long long abs2 = abs((long long)num2);
long long abs3 = abs((long long)num3);
// 转为字符串(仅处理正数部分)
string s1 = to_string(abs1);
string s2 = to_string(abs2);
string s3 = to_string(abs3);
// 步骤2:先算两个数的和,再和第三个数相加(复用两数高精度加法)
string sum12 = l(s1, s2);
string total = l(sum12, s3);
// 步骤3:计算总符号(本题三个数绝对值≤1e9,符号可直接通过数值和判断)
long long total_num = (long long)num1 + num2 + num3;
if (total_num < 0) {
total = "-" + total;
}
// 处理前导0(如结果是"0006"→"6","0000"→"0")
size_t pos = total.find_first_not_of('0');
if (pos != string::npos) {
total = total.substr(pos);
} else {
total = "0";
}
return total;
}
int main() {
int a, b, c;
cin >> a >> b >> c;
// 调用高精度加法函数
string result = ll(a, b, c);
cout << result << endl;
return 0;
}
所以 你看懂了吗

这里空空如也





有帮助,赞一个