Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 16.10.2024
Сообщений: 15

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

16.10.2024, 14:25. Показов 2906. Ответов 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 / 3037 / 1054
Регистрация: 01.06.2021
Сообщений: 11,569
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
Ответ Создать тему
Новые блоги и статьи
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить сумму и количество положительных элементов массива, расположенных в четных строках. Решение: Создан документ с. . .
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности. . . .
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные. . . .
Расчёт стоимости яблок по весу
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Написать программу вычисления стоимости некоторого количества (по весу) яблок. Решение: Создан документ, с табличной частью. . .
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru