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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2014, 22:09   #1
student bmstu
Новичок
Джуниор
 
Регистрация: 08.10.2014
Сообщений: 2
По умолчанию Проблема с факториалом.

написал мини программку, нахождения факториала через функции.. Посмотрите, что не так не могу понять, работает но с ошибками(
Код:
#include "stdafx.h"
#include "conio.h"
int factorial(int x)
{
	for (int i = 1; i < x; i++)
		x = x*i;
	return x;
}
int _tmain(int argc, _TCHAR* argv[])
{ 
	int a;
	printf("vvedite chislo\n");
	scanf_s("%d",&a);
	printf("factorialchik=%d", factorial(a) * 1);
	_getch();
	return 0;
}

Последний раз редактировалось Stilet; 01.11.2014 в 19:09.
student bmstu вне форума Ответить с цитированием
Старый 31.10.2014, 22:13   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

1. инта мало, ну прям очень...
2. factorial(a) * 1 что? зачем?
p51x вне форума Ответить с цитированием
Старый 31.10.2014, 22:15   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

может так

Код:
int factorial(int x)
 {
 for (int i = x-1; i > 0; i--)
 x *= i;
 return x;
 }
f.hump вне форума Ответить с цитированием
Старый 31.10.2014, 22:27   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

или так

Код:
int factorial (int x)
{
if (x < 2) return 1;
return x*factorianl(x-1);
}
?
Вадим Мошев вне форума Ответить с цитированием
Старый 01.11.2014, 09:44   #5
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

student bmstu, когда программа у вас запустится, то первым делом введите число 13 и сравните результат с калькулятором

Потом запустите и введите 12, если будет правильно, то выводите пользователю "Введите число:", а если он ввёл 13, то выводите "Ошибка: число должно быть из диапазона [0, 12]"

Я бы в своих приложениях использовал бы такую функцию (она более быстрая):
Код:
#include <iostream>
#include <stdexcept>
 
unsigned int factorial( unsigned int n ) throw (std::out_of_range)
{
    static const unsigned int table[] = { 1, 1, 2, 6, 24, 120, 720,
                                          5040, 40320, 362880, 3628800,
                                          39916800, 479001600 };
    if ( n >= sizeof table / sizeof *table )
        throw std::out_of_range( "Range error: the number must be from the range [0, 12]" );
    return table[n];
}
 
int main( )
{
    int f = 0;
    int n = 12;
 
    try {
        f = factorial( n );
        std::cout << f << std::endl;
    } catch ( const std::out_of_range& e ) {
        std::cout << e.what( ) << std::endl;
    }
 
    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 01.11.2014, 12:14   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,865
По умолчанию

Да, табличное вычисление факториала рациональнее, чем перемножениями.
Arigato вне форума Ответить с цитированием
Старый 01.11.2014, 14:09   #7
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Да, табличное вычисление факториала рациональнее, чем перемножениями.
Причём в функции создаётся статический массив, а это значит, что не будет затрат на создание массива в стеке. Хотя может и без static, компилятор сам сделает его статическим, не знаю. Мне тоже очень нравится это решение!
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с факториалом! maxick96 Помощь студентам 5 03.12.2012 11:41
Вычисления с факториалом Vlt Помощь студентам 4 18.05.2012 22:41
Проблемы с факториалом as1212 Помощь студентам 1 13.10.2011 20:21
Задача с факториалом bobkoff Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 13.01.2011 18:52