0 / 0 / 0
Регистрация: 16.10.2024
Сообщений: 15

Почему эта программа вычисляет факториал больших чисел неправильно?

16.10.2024, 14:25. Показов 2909. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Крайне интересная программка, призванная вычислять факториал любого числа, вплоть до миллиона и больше. Но есть один нюанс - если взять небольшое число, там однозначное или двухзначное, она успешно его посчитает, мы можем свериться с интернетом и всё верно. Но например факториал 1000 или других больших чисел - число получается неправильным. В чём причина такого феномена и как это исправить?

Так-же хотелось бы услышать ваше мнение о программе, и как её можно ещё оптимизировать для ещё более быстрого расчёта?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#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);
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.10.2024, 14:25
Ответы с готовыми решениями:

Программа неправильно вычисляет значение ряда Тейлора для больших n
Программа должна вычислять значение формулы ниже с точностью до n-ного члена и с максимальной точностью, то есть то бесконечности...

Что вычисляет эта программа
Что вычисляет эта программа ? #include &lt;iostream.h&gt; main() { int i,a,n,k,s; for (I=1;I&lt;=11;I++) {cout&lt;&lt;”введите элементы массива...

Написать программу которая вычисляет факториал чисел введённых с клавиатуры. Количество чисел задать самостоятельно
...

41
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
18.10.2024, 10:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
Системы компьютерной алгебры вычисляют мгновенно. Причем, без погрешности. Имею в виду, выводят/сохраняют в файл все цифры.
Это шутка?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3038 / 1054
Регистрация: 01.06.2021
Сообщений: 11,574
18.10.2024, 10:59
Цитата Сообщение от alexu_007 Посмотреть сообщение
Это шутка?
c чего бы? данная тема как раз хороший пример того, что вместо того, чтобы параллелить говно-алгоритм, нужно просто использовать другой алгоритм
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2024, 10:59

Написать программу которая вычисляет факториал чисел введённых с клавиатуры. Количество чисел задать самостоятельно
Срочно

Программа неправильно вычисляет
Всем добрый день! Помогите пожалуйста с задачей.Надо чтобы ответы сходились.2 работают а вот третья чего-то не хочет. значения не все...

Факториал больших чисел
program factorial; var i, n,otv,x,k,z,w:longint; itog,c,d:string; begin writeln('ввести факториал'); readln(n); k:=12; for...

Факториал больших чисел
Здравствуйте, мне нужно вычислить факториал числа от 1 до 2000. Обычный школьный алгоритм типа f*= i не прокатит, т.к. у числа около 2500...

Факториал больших чисел (> 21)
Всем привет. Я в замешательстве, нужно вычислить &gt; 21!. А насколько я знаю что в с 21! превышает предельные значения для 64-битового числа....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru