Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/55: Рейтинг темы: голосов - 55, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 14

Вычислить факториал натурального числа n из отрезка [1;20]

26.06.2012, 23:20. Показов 10946. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создайте программу, вычисляющую факториал натурального числа n из отрезка [1;20], которое пользователь введёт с клавиатуры. Если число будет введено некорректно, то программа должна сообщить об ошибке. Например, если пользователь ввёл 4, то программа должна вывести 24; если пользователь ввёл -1, то программа должна вывести «ошибка при вводе».
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.06.2012, 23:20
Ответы с готовыми решениями:

Вычислить факториал натурального числа
С или С++ 1. Вычислить n! = 1*2*3*…*n. N – вводится. П.5.16.Правил Запрещено создавать темы с множеством вопросов во всех разделах,...

Вычислить факториал натурального числа n, введённого с клавиатуры.
Создайте программу, вычисляющую факториал натурального числа n, которое пользователь введёт с клавиатуры.

Факториал натурального числа
Составить программу для расчёта факториала натурального числа n(факториал числа n равен 1,2...); В С++ДВУМЯ СПОСОБАМИ while и do while.

26
 Аватар для Andrey.K
348 / 269 / 128
Регистрация: 14.11.2010
Сообщений: 482
27.06.2012, 00:21
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <conio.h>
#include <cmath>
#include <process.h>
using namespace std;
int main()
{
    setlocale(0,"Rus");
    int n,fact=1;
    do
    {
        cout<<"Введите n: ";cin>>n;
        if(n<0) cout<<"Ошибка при вводе!"<<endl;
        if(n==0) { cout<<"Факториал равен 1."<<endl;getch();exit(0); }
    }while(n<0);
    for(int i=1;i<=n;i++)
        fact*=i;
    cout<<"Факториал равен "<<fact<<endl;
    getch();
    return 0;
}
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
27.06.2012, 12:29
Цитата Сообщение от Andrey.K Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <conio.h>
#include <cmath>
#include <process.h>
using namespace std;
int main()
{
    setlocale(0,"Rus");
    int n,fact=1;
    do
    {
        cout<<"Введите n: ";cin>>n;
        if(n<0) cout<<"Ошибка при вводе!"<<endl;
        if(n==0) { cout<<"Факториал равен 1."<<endl;getch();exit(0); }
    }while(n<0);
    for(int i=1;i<=n;i++)
        fact*=i;
    cout<<"Факториал равен "<<fact<<endl;
    getch();
    return 0;
}
А Станиславский бы сказал :"Не верю!", ибо факториал 20 будет больше int'а в разы. Попробуй long long или __int64. Ну а если и их не хватит, то либо в Java, либо ручками писать длинную арифметику.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.06.2012, 13:02
Цитата Сообщение от НикНик Посмотреть сообщение
Создайте программу, вычисляющую факториал натурального числа n из отрезка [1;20], которое пользователь введёт с клавиатуры. Если число будет введено некорректно, то программа должна сообщить об ошибке. Например, если пользователь ввёл 4, то программа должна вывести 24; если пользователь ввёл -1, то программа должна вывести «ошибка при вводе».
- решил написать максимально просто.
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
#include <iostream>
using namespace std;
 
int main()
{
    long value;
    long i, fact;
    while(true)
    {
        fact = 1;
        cout<<"Enter number [1;20] : ";
        if(!(cin>>value) || cin.get() != '\n')
        {
            cin.clear();
            cin.sync();
            cout<<"Bad input\n";
        }
        else
        if(value < 1 || 20 < value)
            cout<<"Entered value not from diapazone [1;20]\n";
        else
        {
            for(i = 1; i <= value; i++)
                fact = fact*i;
            cout<<value<<" != "<<fact<<endl;
        }
    }
    return 0;
}
PS:Для выхода из программы просто закрываем окно консоли мышью
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.06.2012, 13:11
Хотя должен отметить что величина LONG_MAX = 2147483647 будет меньше 17! а следовательно для данного алгоритма либо использовать long long либо для простоты использовать для переменных
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
long value;
* * long i, fact;
тип double (float)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.06.2012, 13:21
Немного подумав пришёл к следующим типам
int value;
unsigned long i, fact;
даже странно что изначально именно так и не сделал
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
#include <iostream>
using namespace std;
 
int main()
{
    int value;
    unsigned long i, fact;
    while(true)
    {
        fact = 1;
        cout<<"Enter number [1;20] : ";
        if(!(cin>>value) || cin.get() != '\n')
        {
            cin.clear();
            cin.sync();
            cout<<"Bad input\n";
        }
        else
        if(value < 1 || 20 < value)
            cout<<"Entered value not from diapazone [1;20]\n";
        else
        {
            for(i = 1; i <= value; i++)
                fact = fact*i;
            cout<<value<<" != "<<fact<<endl;
        }
    }
    return 0;
}
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]  
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
27.06.2012, 13:31
Но считает-то все равно неверно....
20! = 2432902008176640000
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.06.2012, 14:12
Цитата Сообщение от CheshireCat Посмотреть сообщение
Но считает-то все равно неверно....
20! = 2432902008176640000
проанализировав работу алгоритма, столкнулся с непонятным мне моментом 15! и 16!
Код
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
#include <iostream>
using namespace std;
 
int main()
{
    int value;
    double i, fact;
    while(true)
    {
        fact = 1;
        cout<<"Enter number [1;20] : ";
        if(!(cin>>value) || cin.get() != '\n')
        {
            cin.clear();
            cin.sync();
            cout<<"Bad input\n";
        }
        else
        if(value < 1 || 20 < value)
            cout<<"Entered value not from diapazone [1;20]\n";
        else
        {
            for(i = 1; i <= value; i++)
                cout<<"Iteration : "<<i<<endl
                    <<i<<" != "<<(fact = fact*i)<<endl;
        }
    }
    return 0;
}

Поэтому чтобы не ломать голову дал тип double i, fact; и всё стало норм считаться. А вот сбой на 15! и 16! для unsigned long мне пока не понятен
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]   Вычислить факториал натурального числа n из отрезка [1;20]  
0
68 / 68 / 18
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 14:18
Напиши отдельную функцию, которая считает факториал какого-то числа.
А потом уже в цикле проходи все числа от 1 до 20, используя эту функцию

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
else
{
for(i = 1; i <= value; i++)
cout<<"Iteration : "<<i<<endl
<<i<<" != "<<(fact = fact*i)<<endl;
}
Все равно лучше отдельную подпрограмму написть для поиска факториала. Чем это все в цикле рассчитывать
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.06.2012, 14:27
g-h,

Цитата Сообщение от g-h Посмотреть сообщение
Напиши отдельную функцию, которая считает факториал какого-то числа.
А потом уже в цикле проходи все числа от 1 до 20, используя эту функцию
- во первых нерационально в плане прокрут в цикле + факториал для каждого числа отдельно, вот вторых а то я никогда не считал факториал, суть в том что при 15! и 16! наступает непонятная мне ситуация которая приводит к некорректному расчёту.
Вот рекурсивный способ расчёта факториала
C++
1
2
3
4
5
6
7
unsigned long fact(unsigned long n)
{
    unsigned long ret = ((n == 0) ? (n = 1) : n);
    if(1 < (n = n - 1))
        ret = ret*fact(n);
    return ret;
}
но данное задание скорее всего расчитано на начинающих да и диапазон 1-20 дан не спроста, по идеи UNSIGNED LONG должно было хватать.

Добавлено через 4 минуты
Цитата Сообщение от g-h Посмотреть сообщение
Все равно лучше отдельную подпрограмму написть для поиска факториала. Чем это все в цикле рассчитывать
- кто тебе это сказал??? Допустим тебе надо посчитать факторил наших 20-ти + вывести результаты промежуточных вычислений, положим используешь указанную вверху рекурсивную функцию расчёта. Как думаешь что быстрее 20 раз вызвать функцию, которая сама по сути является циклом от 1-го до конкретного числового значения. Либо же за один проход получить все значения обходясь без вызовов и прочего.
Дословно вот схема с вызовом функции расчёта
C++
1
2
3
for(i = 1; i <= val; i++)
for(j = 1; j <= i;    j++)
{}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.06.2012, 14:38
-=ЮрА=-, unsigned long long i, fact;
С 11 стандартом long long int существует.

А я бы решал так:
C++
1
2
3
4
unsigned long long factorial(unsigned long long n)
{
    return !n ? 1 : n * factorial(n - 1);
}
Вроде вывести все факториалы от 1 до N не надо. Тогда бы число лишних итераций зашкаливало.

Мне кажется неверный результат при 15 - 16 из-за перераспределения памяти. Возможно, дальше 15 идет неверный результат.
0
68 / 68 / 18
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 14:42
Сейчас ради любопытства решил подсчитать все факториала от 0 до 30. И вот что получилось! То есть уже при 14 результат получается неправильный
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.06.2012, 14:47
Цитата Сообщение от MrGluck Посмотреть сообщение
А я бы решал так:
unsigned long long factorial(unsigned long long n)
{
* * return !n ? 1 : n * factorial(n - 1);
}
- таже рекурсия только компактней записанная ввиду использования тернарного оператора, дело тут вот в чём неверное вычисление для ULONG обусловлено следующим
ULONG_MAX = 4294967295
12 ! = 479001600
13 ! = 6227020800
Т.е. на 13-ти уже выскакиваем за пределы ULONG_MAX от того и некоректный подсчёт.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.06.2012, 14:50
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- таже рекурсия только компактней записанная ввиду использования тернарного оператора, дело тут вот в чём неверное вычисление для ULONG обусловлено следующим
ULONG_MAX = 4294967295
12 ! = 479001600
13 ! = 6227020800
Т.е. на 13-ти уже выскакиваем за пределы ULONG_MAX от того и некоректный подсчёт.
Ну да, так unsigned long long хватает диапазона для корректного подсчета 20!
Можно смело брать твой код, дописывать в объявлении еще одно long и юзать на здоровье
0
68 / 68 / 18
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 14:50
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Как думаешь что быстрее 20 раз вызвать функцию, которая сама по сути является циклом от 1-го до конкретного числового значения. Либо же за один проход получить все значения обходясь без вызовов и прочего.
Не буду спорить. Может быть оно и быстрее, но если тебе, например, надо посчитать факториал какого-нибудь числа, то ты просто вызываешь функцию fact(n) и все! И больше ничего не надо делать. Это мое мнение и спорить не хочу.
Вот еще допишу. Может быть скорость в играх нужна. Тогда другое дело.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
27.06.2012, 14:59
Цитата Сообщение от g-h Посмотреть сообщение
Это мое мнение и спорить не хочу.
А я и не собирался спорить, просто для конкретной задачи нет необходимости вынесения подсчёта факториала в отдельную функцию.

Цитата Сообщение от MrGluck Посмотреть сообщение
Ну да, так unsigned long long хватает диапазона для корректного подсчета 20!
Можно смело брать твой код, дописывать в объявлении еще одно long и юзать на здоровье
- в принципе да, но мне кажется лучше работать с double(как уже писал), т.к. можно будет вычислять большие значения факториала. Привожу свою окончательную версию (впринципе алгоритм может спокойно щёлкать факторилы и поболее 20, так что ограничение 20 < value можно снять)
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
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
{
    int i, value;
    double fact;
    while(true)
    {
        fact = 1;
        cout<<"Enter number [1;20] : ";
        if(!(cin>>value) || cin.get() != '\n')
        {
            cin.clear();
            cin.sync();
            cout<<"Bad input\n";
        }
        else
        if(value < 1 || 20 < value)
            cout<<"Entered value not from diapazone [1;20]\n";
        else
        {
            for(i = 1; i <= value; i++)
                cout<<"Iteration : "<<i<<endl
                <<i<<" != "<<setprecision(20)
                <<(fact = fact*i)<<endl;
        }
    }
    return 0;
}
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]  
1
68 / 68 / 18
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 15:01
Цитата Сообщение от MrGluck Посмотреть сообщение
Ну да, так unsigned long long хватает диапазона для корректного подсчета 20!
Не хватает. Только до 13 числа а дальше уже переполнение
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.06.2012, 15:03
-=ЮрА=-, все равно далеко уйти не выйдет,
C++
1
setprecision(20)
Все упрется.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.06.2012, 15:04
g-h,
1
68 / 68 / 18
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 15:12
А почему тогда у меня по-другому получается? Самое большое это 13! и все? Вот эту функцию использую
C++
1
2
3
4
5
6
7
8
9
unsigned long long fact(unsigned long n)
{
    unsigned long ret = ( (n==0) ? (n = 1) : n  );
 
    if ( 1 < (n = n-1) )
        ret = ret * fact(n);
 
    return ret;
}
Больше 13! уже неправильно считает
Непонятно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2012, 15:12
Помогаю со студенческими работами здесь

Факториал натурального числа
Найти факториал натурального числа. При реализации программы использовать формулу: вроде с библиотеками и самим факториалом...

Дан факториал натурального числа N. Найти само число.
Привет! Дан факториал натурального числа N. Найти само число. Например, если факториал 24, то N=4. Помогите написать код пожалуйста:)

7. Написать программу, позволяющую подсчитывать факториал натурального числа
Написать программу, позволяющую подсчитывать факториал натурального числа

Известен факториал f некоторого натурального числа. Найти это число
Известен факториал f некоторого натурального числа. Найти это число. Помогите пожалуйста решить!

Напишите функцию, которая вычисляет факториал для заданного натурального числа
аголовок функции должен быть следующим: int factorial(int n); Напишите программу, которая получает от пользователя два натуральных числа a...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru