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

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

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

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

26.06.2012, 23:20. Просмотров 4081. Ответов 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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 14:59 #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;
}
1
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]  
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 15:01 #17
Цитата Сообщение от MrGluck Посмотреть сообщение
Ну да, так unsigned long long хватает диапазона для корректного подсчета 20!
Не хватает. Только до 13 числа а дальше уже переполнение
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
27.06.2012, 15:03 #18
-=ЮрА=-, все равно далеко уйти не выйдет,
C++
1
setprecision(20)
Все упрется.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,927
27.06.2012, 15:04 #19
g-h,Вычислить факториал натурального числа n из отрезка [1;20]
1
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
27.06.2012, 15:12 #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! уже неправильно считает
Непонятно
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 15:21 #21
Цитата Сообщение от MrGluck Посмотреть сообщение
-=ЮрА=-, все равно далеко уйти не выйдет,
Код C++
1
setprecision(20)
Все упрется.
- что значит упрётся?
C++
1
2
3
4
5
else
        if(value < 1 /*|| 20 < value*/)
            cout<<"Entered value not from diapazone [1;20]\n";
        else
        {
0
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]  
-=ЮрА=-
27.06.2012, 15:23
  #22

Не по теме:

Если хотим пропечатать побольше ноликов то делаем setprecision(2*value) и всё, вообще не понял что имелось ввиду под словами упрётся...

0
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
27.06.2012, 15:27 #23
К сожалению, при вычислении факториала как double проблема очень-очень быстро возникнет в точности вычисления:
Iteration : 23
23! =
Double 25852016738884978212864
Really 25852016738884976640000
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 15:38 #24
Так ребята что вам не так считается???Хватит обсасывать эту тему, с учётом всех замечений по поводу точности (о которой уже раза 4-ри сказал - НАДО double) а также замечений касательно числа выводимых разрядов с помощью setprecision
Компилируем код ниже и заканчиваем дискусию которая лично меня уже злит
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(2*value)
                <<(fact = fact*i)<<endl;
        }
    }
    return 0;
}
CheshireCat, как ты получил такой резульатат double???
Цитата Сообщение от CheshireCat Посмотреть сообщение
Double 25852016738884978212864
0
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]   Вычислить факториал натурального числа n из отрезка [1;20]  
CheshireCat
27.06.2012, 15:44
  #25

Не по теме:

-=ЮрА=- : Это GCC 4.7, с другими компиляторами не экспериментировал - лень.... уверен, проблема все равно проявится - не раньше, так позже.

0
-=ЮрА=-
27.06.2012, 15:58
  #26

Не по теме:

Цитата Сообщение от CheshireCat Посмотреть сообщение
-=ЮрА=- : Это GCC 4.7, с другими компиляторами не экспериментировал - лень.... уверен, проблема все равно проявится - не раньше, так позже.
вот тест для 150!
Код этот (в принципе ничего не менял)
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
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
{
    int i, value;
    double fact;
    while(true)
    {
        fact = 1;
        cout<<"Enter number: ";
        if(!(cin>>value) || cin.get() != '\n')
        {
            cin.clear();
            cin.sync();
            cout<<"Bad input\n";
        }
        else
        if(value < 0)
            cout<<"Entered value must be positive \n";
        else
        {
            for(i = 1; i < value; i++)
                cout<<"Iteration : "<<i<<endl
                <<i<<" != "<<setprecision(2*value)
                <<(fact = fact*i)<<endl;
            cout<<value<<" != "<<setprecision(2*value)
                <<(fact = fact*i)<<endl;
        }
    }
    return 0;
}

0
CheshireCat
27.06.2012, 16:09     Вычислить факториал натурального числа n из отрезка [1;20]
  #27

Не по теме:

Гм. Врет-с....
150! =
571338395644585459047893286526105400318955357860112641825483758331798291248453983931265744886753111453771078787468542041
626662501986845044663559491959220665749425920957357789293253572904449624724054167907221184454371222696755200000000000000
00000000000000000000000

Что и неудивительно, т.к. точность числа double - 15 (ну, 16....) десятичных цифр - определена std::numeric_limits<double>::digits10.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 16:09
Привет! Вот еще темы с ответами:

вычислить факториал числа 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, 16:09
Ответ Создать тему
Опции темы

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