2.0版,448行
2025-12-09 18:45:42
发布于:福建
1阅读
0回复
0点赞
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <memory>
#include <stdexcept>
#include <type_traits>
#include <utility>
#include <tuple>
#include <array>
#include <deque>
#include <list>
#include <forward_list>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <stack>
#include <queue>
#include <iterator>
#include <numeric>
#include <limits>
#include <cmath>
#include <cctype>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <climits>
#include <cwchar>
#include <cwctype>
#include <exception>
#include <locale>
#include <codecvt>
#include <fstream>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <istream>
#include <ostream>
#include <sstream>
#include <streambuf>
#include <complex>
#include <valarray>
#include <bitset>
#include <regex>
#include <random>
#include <chrono>
#include <initializer_list>
#include <system_error>
#include <future>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <cfenv>
#include <cinttypes>
#include <cstdint>
#include <cuchar>
#include <new>
#include <typeinfo>
#include <ratio>
#include <scoped_allocator>
#include <ciso646>
#include <clocale>
#include <cstdarg>
#include <cstdbool>
#include <cstddef>
#include <csetjmp>
#include <csignal>
#include <cfloat>
#include <cerrno>
// ==================== 层1:编译时计算 ====================
namespace CompileTimeMath {
template<int N>
struct Fibonacci {
static constexpr int value = Fibonacci<N-1>::value + Fibonacci<N-2>::value;
};
template<> struct Fibonacci<0> { static constexpr int value = 0; };
template<> struct Fibonacci<1> { static constexpr int value = 1; };
template<int A, int B>
struct StaticAdd {
static constexpr int value = A + B;
};
}
// ==================== 层2:异常系统 ====================
class ArithmeticException : public std::exception {
std::string msg;
public:
ArithmeticException(const std::string& m) : msg(m) {}
const char* what() const noexcept override { return msg.c_str(); }
};
// ==================== 层3:抽象接口 ====================
class IAdder {
public:
virtual ~IAdder() = default;
virtual std::string add(const std::string& a, const std::string& b) const = 0;
virtual std::string getName() const = 0;
};
// ==================== 层4:具体实现 ====================
class SimpleAdder : public IAdder {
public:
std::string add(const std::string& a, const std::string& b) const override {
std::string result;
int carry = 0;
int i = a.size() - 1;
int j = b.size() - 1;
while (i >= 0 || j >= 0 || carry) {
int sum = carry;
if (i >= 0) sum += a[i--] - '0';
if (j >= 0) sum += b[j--] - '0';
carry = sum / 10;
result.push_back('0' + (sum % 10));
}
std::reverse(result.begin(), result.end());
if (result.empty()) return "0";
size_t pos = result.find_first_not_of('0');
return pos == std::string::npos ? "0" : result.substr(pos);
}
std::string getName() const override { return "SimpleAdder"; }
};
class FastAdder : public IAdder {
public:
std::string add(const std::string& a, const std::string& b) const override {
if (a.size() < b.size()) return add(b, a);
std::string result = a;
int carry = 0;
int i = a.size() - 1;
int j = b.size() - 1;
while (i >= 0) {
int digit_a = result[i] - '0';
int digit_b = j >= 0 ? b[j--] - '0' : 0;
int sum = digit_a + digit_b + carry;
carry = sum / 10;
result[i] = '0' + (sum % 10);
i--;
}
if (carry) result = "1" + result;
return result;
}
std::string getName() const override { return "FastAdder"; }
};
// ==================== 层5:装饰器 ====================
class AdderDecorator : public IAdder {
protected:
std::unique_ptr<IAdder> wrapped;
public:
AdderDecorator(std::unique_ptr<IAdder> adder) : wrapped(std::move(adder)) {}
std::string add(const std::string& a, const std::string& b) const override {
return wrapped->add(a, b);
}
std::string getName() const override {
return wrapped->getName();
}
};
class ValidatingAdder : public AdderDecorator {
public:
using AdderDecorator::AdderDecorator;
std::string add(const std::string& a, const std::string& b) const override {
// 输入验证
for (char c : a) if (!isdigit(c)) throw ArithmeticException("Invalid digit in a");
for (char c : b) if (!isdigit(c)) throw ArithmeticException("Invalid digit in b");
// 计算
std::string result = wrapped->add(a, b);
// 结果验证
if (!result.empty() && result[0] == '0' && result.size() > 1) {
throw ArithmeticException("Invalid result format");
}
return result;
}
};
class TimingAdder : public AdderDecorator {
public:
using AdderDecorator::AdderDecorator;
std::string add(const std::string& a, const std::string& b) const override {
auto start = std::chrono::high_resolution_clock::now();
std::string result = wrapped->add(a, b);
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
// 可以记录时间,这里不输出以免影响OJ
(void)duration; // 避免未使用警告
return result;
}
};
// ==================== 层6:工厂 ====================
class AdderFactory {
public:
enum AdderType { SIMPLE, FAST, VALIDATED, TIMING };
static std::unique_ptr<IAdder> create(AdderType type) {
switch (type) {
case SIMPLE: return std::make_unique<SimpleAdder>();
case FAST: return std::make_unique<FastAdder>();
case VALIDATED:
return std::make_unique<ValidatingAdder>(std::make_unique<SimpleAdder>());
case TIMING:
return std::make_unique<TimingAdder>(
std::make_unique<ValidatingAdder>(std::make_unique<FastAdder>()));
default: return std::make_unique<SimpleAdder>();
}
}
};
// ==================== 层7:输入处理器 ====================
class InputProcessor {
private:
std::string trim(const std::string& s) {
auto start = s.find_first_not_of(" \t\n\r");
auto end = s.find_last_not_of(" \t\n\r");
if (start == std::string::npos) return "";
return s.substr(start, end - start + 1);
}
bool isValidNumber(const std::string& s) {
if (s.empty()) return false;
for (char c : s) if (!isdigit(c)) return false;
try {
// 检查是否在范围内
if (s.size() > 10) return false; // 超过int范围
long long val = std::stoll(s);
return val >= 0 && val <= 1000000000;
} catch (...) {
return false;
}
}
public:
std::pair<std::string, std::string> parseInput() {
std::string line;
if (!std::getline(std::cin, line)) {
throw ArithmeticException("无法读取输入");
}
std::istringstream iss(line);
std::vector<std::string> tokens;
std::string token;
while (iss >> token) {
tokens.push_back(token);
}
if (tokens.size() != 2) {
throw ArithmeticException("需要恰好两个数字");
}
tokens[0] = trim(tokens[0]);
tokens[1] = trim(tokens[1]);
if (!isValidNumber(tokens[0]) || !isValidNumber(tokens[1])) {
throw ArithmeticException("无效的数字格式或超出范围");
}
return {tokens[0], tokens[1]};
}
};
// ==================== 层8:验证器 ====================
class ResultValidator {
public:
static bool validateAddition(const std::string& a, const std::string& b, const std::string& result) {
// 方法1:使用字符串加法验证
SimpleAdder simple;
std::string expected = simple.add(a, b);
// 方法2:如果数字小,使用整数验证
try {
if (a.size() <= 9 && b.size() <= 9) {
long long val_a = std::stoll(a);
long long val_b = std::stoll(b);
long long val_result = std::stoll(result);
if (val_a + val_b != val_result) return false;
}
} catch (...) {
// 忽略转换异常,使用字符串验证
}
return expected == result;
}
};
// ==================== 层9:计算引擎 ====================
class CalculationEngine {
private:
std::unique_ptr<IAdder> adder;
InputProcessor inputProcessor;
int computationCount;
public:
CalculationEngine() : computationCount(0) {
// 根据编译时计算结果选择算法
constexpr int fib10 = CompileTimeMath::Fibonacci<10>::value;
constexpr int staticSum = CompileTimeMath::StaticAdd<1, 1>::value;
// 使用编译时信息选择算法
if constexpr (fib10 > 50 && staticSum == 2) {
adder = AdderFactory::create(AdderFactory::TIMING);
} else {
adder = AdderFactory::create(AdderFactory::VALIDATED);
}
}
std::string execute() {
try {
auto [a, b] = inputProcessor.parseInput();
// 记录计算
computationCount++;
// 执行计算
std::string result = adder->add(a, b);
// 验证结果
if (!ResultValidator::validateAddition(a, b, result)) {
throw ArithmeticException("结果验证失败");
}
// 使用编译时计算进行最终检查
constexpr int check = CompileTimeMath::StaticAdd<0, 0>::value;
static_assert(check == 0, "编译时验证失败");
return result;
} catch (const std::exception& e) {
// 回退方案
std::cerr << "错误: " << e.what() << ",使用简单方法重试..." << std::endl;
return fallbackCalculation();
}
}
private:
std::string fallbackCalculation() {
std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);
long long a, b;
if (iss >> a >> b) {
if (a < 0 || a > 1000000000 || b < 0 || b > 1000000000) {
throw ArithmeticException("数字超出范围");
}
return std::to_string(a + b);
}
throw ArithmeticException("无法恢复的输入错误");
}
};
// ==================== 层10:主程序 ====================
int main() {
try {
// 初始化引擎
CalculationEngine engine;
// 执行计算
std::string result = engine.execute();
// 输出结果
std::cout << result << std::endl;
// 使用复杂的返回逻辑
int returnCode = 0;
// 使用编译时验证确保正确性
static_assert(CompileTimeMath::StaticAdd<2, 2>::value == 4, "数学基础错误");
// 使用条件编译
#ifdef __cplusplus
if (__cplusplus >= 201103L) {
returnCode = EXIT_SUCCESS;
} else {
returnCode = 0;
}
#else
returnCode = 0;
#endif
// 最终返回
asm volatile ("" : : "r"(returnCode)); // 阻止优化
if (returnCode == EXIT_SUCCESS || returnCode == 0) {
return returnCode;
}
// 理论上不会到达这里
return 1;
} catch (const std::exception& e) {
std::cerr << "致命错误: " << e.what() << std::endl;
// 终极回退
std::string line;
if (std::getline(std::cin, line)) {
std::istringstream iss(line);
int a, b;
if (iss >> a >> b) {
std::cout << (a + b) << std::endl;
return 0;
}
}
return 1;
}
}
// ==================== 层11:静态断言 ====================
namespace StaticVerification {
// 验证编译时计算
static_assert(CompileTimeMath::Fibonacci<0>::value == 0, "F(0)错误");
static_assert(CompileTimeMath::Fibonacci<1>::value == 1, "F(1)错误");
static_assert(CompileTimeMath::Fibonacci<5>::value == 5, "F(5)错误");
static_assert(CompileTimeMath::Fibonacci<10>::value == 55, "F(10)错误");
// 验证加法
static_assert(CompileTimeMath::StaticAdd<0, 0>::value == 0, "0+0错误");
static_assert(CompileTimeMath::StaticAdd<1, 1>::value == 2, "1+1错误");
static_assert(CompileTimeMath::StaticAdd<100, 200>::value == 300, "100+200错误");
static_assert(CompileTimeMath::StaticAdd<999999999, 1>::value == 1000000000, "边界测试错误");
}
这里空空如也







有帮助,赞一个