#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;
}