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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.63
НикНик
0 / 0 / 0
Регистрация: 26.06.2012
Сообщений: 14
#1

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

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

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

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

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

Вычислить факториал числа - C++
Требуется по заданному числу 1<=N<=12 посчитать его факториал. Учтите, что факториал растет очень бысто и уже при N = 13 результат выйдет...

Циклы: вычислить факториал числа - C++
1.Надо написать программу которая будет вычислять факториал числа.я вот пробовал чёт не получается: #include "stdafx.h" #include...

Вычислить факториал числа через оператор do while - C++
Итак, задача следующая: Написать программу вычисления факториала целого положительного числа N! Решить эту задачу в двух вариантах: с...

Вычислить факториал заданного целого числа - C++
Составить блок схему алгоритма и программу согласно условию задачи. Вычислить факториал заданного целого числа. Факториал числа N...

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

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

вычислить факториал числа n, где n вводисться с клавиатуры. n! = 1 * 2 * 3 *...* n - C++
вычислить факториал числа n, где n вводисться с клавиатуры. n! = 1 * 2 * 3 *...* n

Вычислить факториал заданного числа при помощи рекурсивной функции - C++
Разбирался с рекурсией и вот вдруг возникла проблема. При компиляции выдает совсем не тот результат которые ожидается, ище выдает...

Вычислить сумму цифр натурального числа - C++
Мне дали задания. Есть int число например int m = 627. Нужно найти суму елементов m. suma = 6+2+7 = 15. Как то так. Нужно сделать всьо...

Вычислить для данного натурального числа - C++
Здравствуйте. Помогите пожалуйста решить задачи: 1) Вычислить для данного натурального числа N \left(1+\frac{1}{{1}^{1}}...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.06.2012, 14:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru