Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2011, 09:57   #1
Hardander
 
Регистрация: 26.04.2010
Сообщений: 9
По умолчанию Не понятно, как вычисляется факториал в программе (С++)

Вот такой код для вычисления факториала числа:

#include<iostream>
#include<math.h>
#include <clocale>
using namespace std;

int factorial (int x);
int main ()
{
setlocale (LC_CTYPE, "Russian");
int n;

while (1)
{
cout << "Введите число, факториал которого необходимо вычислить \n";
cin >> n;
cout << "Факториал введенного числа равняется: " << factorial (n)<< endl;
}

return 0;
}

int factorial (int n)
{
int i, fact;
fact = 1;
for (i=1; i <= n; i++)
fact *= i;
return fact;
}


До значения n=32 результат факториала похож на правду. Но при n=32 - результат становится отрицательным... а при n=34 - вообще результат = 0. В чем заноза, подскажите пожалуйста?
Hardander вне форума Ответить с цитированием
Старый 26.01.2011, 10:02   #2
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

а сколько показывает при n=32 ? наверняка больше 32767 ) измените с int на long int, все будет нормально )
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 26.01.2011, 10:19   #3
Hardander
 
Регистрация: 26.04.2010
Сообщений: 9
По умолчанию

Позаменял все int - ы... Ничего не изменилось... а при значении n=32 факториал по данной программе равен "- 2147483648"

#include<iostream>
#include<math.h>
#include <clocale>
using namespace std;

long int factorial (long int x);
long int main ()
{
setlocale (LC_CTYPE, "Russian");
long int n;

while (1)
{
cout << "Введите число, факториал которого необходимо вычислить \n";
cin >> n;
cout << "Факториал введенного числа равняется: " << factorial (n)<< endl;
}

return 0;
}

long int factorial (long int n)
{
long int i, fact;
fact = 1;
for (i=1; i <= n; i++)
fact *= i;
return fact;
}
Hardander вне форума Ответить с цитированием
Старый 26.01.2011, 12:53   #4
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

а, все ясно, итак, смотри
переменная int занимает 2 байта, это 16 бит 1111 1111 1111 1111, или 65535 (unsigned int) в десятичной,идем дальше
переменная long занимает в памяти 4 байта, 32 бита, 1111 1111 1111 1111 1111 1111 1111 1111 - это 4294967295 (unsigned long),

если же посчитать на калькуляторе виндовс, засунув туда число в 8 байт и посчитав факториал от 32, мы получаем 2,024083361028411770517061632 * 10^34, как ты думаешь, уместится такое число в 4 байта ?

используй тип данных

long double - это 10 байт

Код:
long double factorial (int n)
{
	int i;
	long double fact;
	fact = 1;
	for (i=1; i <= n; i++)
		fact *= i;
	return fact;
}
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery

Последний раз редактировалось kaljan775; 26.01.2011 в 12:55.
kaljan775 вне форума Ответить с цитированием
Старый 26.01.2011, 13:07   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

sizeof(long double) = 12

Код:
#include <iostream>

long double fact(int n){
     long double res = 1;
     for(; n > 0; res*=n, n--);
     return res;
}

int main(void){
    std::cout << fact(170);
    std::cin.get();
    return 0;
}

Последний раз редактировалось NiCola999; 26.01.2011 в 13:10.
NiCola999 вне форума Ответить с цитированием
Старый 26.01.2011, 13:17   #6
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

круто, еще раз удостоверяюсь что не стоит верить интернету на 100% и стоит все перепроверять
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 26.01.2011, 13:29   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

зависит от архитектуры, это на 32
NiCola999 вне форума Ответить с цитированием
Старый 26.01.2011, 13:44   #8
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

благодарю за объяснение
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 26.01.2011, 14:19   #9
Hardander
 
Регистрация: 26.04.2010
Сообщений: 9
По умолчанию

Тээксс... Понятно... Благодарен вам за вразумительные ответы!
Hardander вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Элементы массива a(n) вычисляется по правилу... om3n Помощь студентам 2 20.06.2010 15:30
Не понятно. Как это сделано kzld Microsoft Office Excel 2 31.03.2010 11:24
объясните просто и понятно, как составить программу на BASIC mmarina80 Помощь студентам 5 03.01.2010 18:10
Не понятно, как создавать таблицы в CSS. Ulan HTML и CSS 4 17.07.2008 16:18
Ассемблер. Факториал числа. Коментарии к программе Irwin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 03.05.2007 13:52