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

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

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

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

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

Создайте программу, вычисляющую факториал натурального числа n из отрезка [1;20], которое пользователь введёт с клавиатуры. Если число будет введено некорректно, то программа должна сообщить об ошибке. Например, если пользователь ввёл 4, то программа должна вывести 24; если пользователь ввёл -1, то программа должна вывести «ошибка при вводе».
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 23:20     Вычислить факториал натурального числа n из отрезка [1;20]
Посмотрите здесь:
C++ Факториал натурального числа
C++ Напишите функцию, которая вычисляет факториал для заданного натурального числа
C++ Вычислить факториал числа
C++ Циклы: вычислить факториал числа
Вычислить факториал заданного целого числа C++
Вычислить факториал числа через оператор do while C++
C++ вычислить факториал числа n, где n вводисться с клавиатуры. n! = 1 * 2 * 3 *...* 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
Модератор
Эксперт CЭксперт С++
7163 / 4329 / 632
Регистрация: 29.11.2010
Сообщений: 11,751
27.06.2012, 15:03     Вычислить факториал натурального числа n из отрезка [1;20] #18
-=ЮрА=-, все равно далеко уйти не выйдет,
C++
1
setprecision(20)
Все упрется.
MrGluck
Модератор
Эксперт CЭксперт С++
7163 / 4329 / 632
Регистрация: 29.11.2010
Сообщений: 11,751
27.06.2012, 15:04     Вычислить факториал натурального числа n из отрезка [1;20] #19
g-h,Вычислить факториал натурального числа n из отрезка [1;20]
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! уже неправильно считает
Непонятно
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 15:21     Вычислить факториал натурального числа n из отрезка [1;20] #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
        {
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]  
-=ЮрА=-
27.06.2012, 15:23
  #22

Не по теме:

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

CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
27.06.2012, 15:27     Вычислить факториал натурального числа n из отрезка [1;20] #23
К сожалению, при вычислении факториала как double проблема очень-очень быстро возникнет в точности вычисления:
Iteration : 23
23! =
Double 25852016738884978212864
Really 25852016738884976640000
-=ЮрА=-
Заблокирован
Автор FAQ
27.06.2012, 15:38     Вычислить факториал натурального числа n из отрезка [1;20] #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
Миниатюры
Вычислить факториал натурального числа n из отрезка [1;20]   Вычислить факториал натурального числа n из отрезка [1;20]  
CheshireCat
27.06.2012, 15:44
  #25

Не по теме:

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

-=ЮрА=-
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;
}

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 16:09     Вычислить факториал натурального числа n из отрезка [1;20]
Еще ссылки по теме:
C++ Вычислить факториал заданного числа при помощи рекурсивной функции
Вычислить сумму цифр натурального числа C++
Вычислить для данного натурального числа C++
Вычислить отношение произведения цифр натурального числа к их сумме C++
C++ Для заданного натурального числа N вычислить и вывести на экран

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

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

Не по теме:

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

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

Yandex
Объявления
27.06.2012, 16:09     Вычислить факториал натурального числа n из отрезка [1;20]
Ответ Создать тему
Опции темы

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