#include <vector>
#include <iostream>
#include <thread>
#include <mutex>
#include <fstream>
#include <sstream>
#include <iomanip>
constexpr unsigned BASE = 1000000000;
std::mutex mtx;
void multiply_range(std::vector<unsigned long long>& factorial, unsigned long long start, unsigned long long end) {
unsigned long long carry = 0;
for (unsigned long long i = start; i <= end; ++i) {
for (size_t j = 0; j < factorial.size(); ++j) {
unsigned long long result = factorial[j] * i + carry;
factorial[j] = result % BASE;
carry = result / BASE;
}
while (carry) {
std::lock_guard<std::mutex> lock(mtx);
factorial.push_back(carry % BASE);
carry /= BASE;
}
}
}
std::vector<unsigned long long> fast_factorial(unsigned long long& n) {
std::vector<unsigned long long> factorial;
factorial.reserve(1 + n);
factorial.push_back(1);
unsigned num_threads = std::thread::hardware_concurrency();
std::vector<std::thread> threads;
unsigned long long range = n / num_threads;
for (unsigned i = 0; i < num_threads; ++i) {
unsigned long long start = i * range + 2;
unsigned long long end = (i == num_threads - 1) ? n : (start + range - 1);
threads.emplace_back(multiply_range, std::ref(factorial), start, end);
}
for (auto& thread : threads) {
thread.join();
}
return factorial;
}
void write_factorial_to_file(unsigned long long& n, const std::vector<unsigned long long>& factorial) {
std::ostringstream filename;
filename << "Факториал числа " << n << ".txt";
std::ofstream outfile(filename.str());
if (outfile.is_open()) {
for (int i = factorial.size() - 1; i >= 0; i--) {
if (i != factorial.size() - 1) {
outfile << std::setw(9) << std::setfill('0') << factorial[i];
}
else {
outfile << factorial[i];
}
}
outfile << std::endl;
outfile.close();
}
else {
printf("Не удалось открыть файл для записи.");
printf("\n");
printf("Попробуйте переместить программу в другую папку.");
return;
}
}
int main() {
setlocale(LC_ALL, "ru");
unsigned long long n;
while (true) {
printf("Введите число, для которого нужно вычислить факториал: ");
std::cin >> n;
while (n <= 0) {
printf("Некорректное число, введите другое число: ");
std::cin >> n;
}
printf("Вычисление факториала...\n");
std::vector<unsigned long long> factorial = fast_factorial(n);
write_factorial_to_file(n, factorial);
printf("Результат записан в файл: Факториал числа %llu.txt\n\n", n);
}
}
.......998 * 998 * 999 =
unsigned long long result = factorial[j] * i + carry;
factorial[j] = result % BASE;
carry = result / BASE;
Я просто не программист, это у меня задание такое.
Сторонние библиотеки по условиям нельзя.
Про SIMD слышу впервые.