Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.63
НикНик
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 14
26.06.2012, 23:20     Вычислить факториал натурального числа n из отрезка [1;20] #1
Создайте программу, вычисляющую факториал натурального числа n из отрезка [1;20], которое пользователь введёт с клавиатуры. Если число будет введено некорректно, то программа должна сообщить об ошибке. Например, если пользователь ввёл 4, то программа должна вывести 24; если пользователь ввёл -1, то программа должна вывести «ошибка при вводе».
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 23:20     Вычислить факториал натурального числа n из отрезка [1;20]
Посмотрите здесь:

C++ Для заданного натурального числа N вычислить и вывести на экран
C++ Циклы.Вычислить Факториал числа.
C++ вычислить факториал числа n, где n вводисться с клавиатуры. n! = 1 * 2 * 3 *...* n
Для заданного натурального числа n и действительных чисел x0 и A вычислить Xn, по итерационной формуле: C++
Вычислить для данного натурального числа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrey.K
 Аватар для Andrey.K
338 / 259 / 15
Регистрация: 14.11.2010
Сообщений: 480
27.06.2012, 00:21     Вычислить факториал натурального числа n из отрезка [1;20] #2
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;
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
27.06.2012, 12:29     Вычислить факториал натурального числа n из отрезка [1;20] #3
Цитата Сообщение от 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, либо ручками писать длинную арифметику.
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 13:02     Вычислить факториал натурального числа n из отрезка [1;20] #4
Цитата Сообщение от НикНик Посмотреть сообщение
Создайте программу, вычисляющую факториал натурального числа 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]  
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 13:11     Вычислить факториал натурального числа n из отрезка [1;20] #5
Хотя должен отметить что величина LONG_MAX = 2147483647 будет меньше 17! а следовательно для данного алгоритма либо использовать long long либо для простоты использовать для переменных
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
long value;
* * long i, fact;
тип double (float)
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 13:21     Вычислить факториал натурального числа n из отрезка [1;20] #6
Немного подумав пришёл к следующим типам
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]  
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
27.06.2012, 13:31     Вычислить факториал натурального числа n из отрезка [1;20] #7
Но считает-то все равно неверно....
20! = 2432902008176640000
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 14:12     Вычислить факториал натурального числа n из отрезка [1;20] #8
Цитата Сообщение от 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]  
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 14:18     Вычислить факториал натурального числа n из отрезка [1;20] #9
Напиши отдельную функцию, которая считает факториал какого-то числа.
А потом уже в цикле проходи все числа от 1 до 20, используя эту функцию

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
else
{
for(i = 1; i <= value; i++)
cout<<"Iteration : "<<i<<endl
<<i<<" != "<<(fact = fact*i)<<endl;
}
Все равно лучше отдельную подпрограмму написть для поиска факториала. Чем это все в цикле рассчитывать
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 14:27     Вычислить факториал натурального числа n из отрезка [1;20] #10
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++)
{}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,413
27.06.2012, 14:38     Вычислить факториал натурального числа n из отрезка [1;20] #11
-=ЮрА=-, 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 идет неверный результат.
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 14:42     Вычислить факториал натурального числа n из отрезка [1;20] #12
Сейчас ради любопытства решил подсчитать все факториала от 0 до 30. И вот что получилось! То есть уже при 14 результат получается неправильный
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]  
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 14:47     Вычислить факториал натурального числа n из отрезка [1;20] #13
Цитата Сообщение от 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 от того и некоректный подсчёт.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,413
27.06.2012, 14:50     Вычислить факториал натурального числа n из отрезка [1;20] #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- таже рекурсия только компактней записанная ввиду использования тернарного оператора, дело тут вот в чём неверное вычисление для ULONG обусловлено следующим
ULONG_MAX = 4294967295
12 ! = 479001600
13 ! = 6227020800
Т.е. на 13-ти уже выскакиваем за пределы ULONG_MAX от того и некоректный подсчёт.
Ну да, так unsigned long long хватает диапазона для корректного подсчета 20!
Можно смело брать твой код, дописывать в объявлении еще одно long и юзать на здоровье
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 14:50     Вычислить факториал натурального числа n из отрезка [1;20] #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Как думаешь что быстрее 20 раз вызвать функцию, которая сама по сути является циклом от 1-го до конкретного числового значения. Либо же за один проход получить все значения обходясь без вызовов и прочего.
Не буду спорить. Может быть оно и быстрее, но если тебе, например, надо посчитать факториал какого-нибудь числа, то ты просто вызываешь функцию fact(n) и все! И больше ничего не надо делать. Это мое мнение и спорить не хочу.
Вот еще допишу. Может быть скорость в играх нужна. Тогда другое дело.
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 14:59     Вычислить факториал натурального числа n из отрезка [1;20] #16
Цитата Сообщение от 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]  
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 15:01     Вычислить факториал натурального числа n из отрезка [1;20] #17
Цитата Сообщение от MrGluck Посмотреть сообщение
Ну да, так unsigned long long хватает диапазона для корректного подсчета 20!
Не хватает. Только до 13 числа а дальше уже переполнение
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,413
27.06.2012, 15:03     Вычислить факториал натурального числа n из отрезка [1;20] #18
-=ЮрА=-, все равно далеко уйти не выйдет,
C++
1
setprecision(20)
Все упрется.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,413
27.06.2012, 15:04     Вычислить факториал натурального числа n из отрезка [1;20] #19
g-h,Вычислить факториал натурального числа n из отрезка [1;20]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 15:12     Вычислить факториал натурального числа n из отрезка [1;20]
Еще ссылки по теме:

Вычислить факториал числа через оператор do while C++
Вычислить факториал заданного целого числа C++
C++ Факториал натурального числа

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

Или воспользуйтесь поиском по форуму:
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 15:12     Вычислить факториал натурального числа n из отрезка [1;20] #20
А почему тогда у меня по-другому получается? Самое большое это 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! уже неправильно считает
Непонятно
Yandex
Объявления
27.06.2012, 15:12     Вычислить факториал натурального числа n из отрезка [1;20]
Ответ Создать тему
Опции темы

Текущее время: 19:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru