#include <iostream>
#include <fstream>
#include <string>
#include <random>
#include <algorithm>

// 生成一个近似于10的指定幂次方的随机大数字符串
std::string generateApproximateTenToThePower(int power) {
    std::string number;
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 9);

    // 先生成一个最高位为非零数字的随机数
    int leadingDigit = dis(gen);
    while (leadingDigit == 0) {
        leadingDigit = dis(gen);
    }
    number += std::to_string(leadingDigit);

    // 生成剩余的随机数字
    for (int i = 1; i < power; ++i) {
        number += std::to_string(dis(gen));
    }

    return number;
}

// 比较两个大数字符串的长度,返回较长的长度
int maxLength(const std::string& num1, const std::string& num2) {
    return num1.size() > num2.size()? num1.size() : num2.size();
}

// 两个大数字符串相加
std::string addLargeNumbers(const std::string& num1, const std::string& num2) {
    std::string result;
    int carry = 0;
    int i = num1.size() - 1;
    int j = num2.size() - 1;

    // 逐位相加
    while (i >= 0 || j >= 0 || carry!= 0) {
        int sum = carry;
        if (i >= 0) {
            sum += num1[i] - '0';
            i--;
        }
        if (j >= 0) {
            sum += num2[j] - '0';
            j--;
        }

        // 处理进位
        carry = sum / 10;
        result.push_back(sum % 10 + '0');
    }

    // 反转结果字符串使其符合正常的数字顺序
    std::reverse(result.begin(), result.begin() + result.size());

    return result;
}

int main() {
    // 生成两个近似于10的n次方的随机大数字符串
    std::string num1 = generateApproximateTenToThePower(n);
    std::string num2 = generateApproximateTenToThePower(n);

    // 创建并打开名为1.txt的文本文档
    std::ofstream outFile1("in.txt");
    if (outFile1.is_open()) {
        // 将两个数写入文件
        outFile1 << num1 << " " << std::endl;
        outFile1 << num2 << std::endl;
        outFile1.close();
        std::cout << "数据已成功写入in.txt文件。" << std::endl;
    } else {
        std::cout << "无法打开文件in.txt进行写入。" << std::endl;
    }

    // 计算两数之和
    std::string sum = addLargeNumbers(num1, num2);

    // 创建并打开名为2.txt的文本文档
    std::ofstream outFile2("out.txt");
    if (outFile2.is_open()) {
        // 将两数之和写入文件
        outFile2 << sum << std::endl;
        outFile2.close();
        std::cout << "数据已成功写入out.txt文件。" << std::endl;
    } else {
        std::cout << "无法打开文件out.txt进行写入。" << std::endl;
    }

    return 0;
}