Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Проблем с Факториел в C++

Featured Replies

Значи имам една задача където трябва да намеря N! , където N>0, N<50 000 и N е цяло число. С това което съм написал работи добре с ниските числа, но като въведа N да е повече от 20 и бъгва...

 

 

#include <iostream>

using namespace std;

int main()

{

      int N;

      long long pr=1;

      do cin>>N; while (N<1 || N>49999);

      for (int i=1;i<=N;i++)

            pr*=i;

      cout<<pr<<endl;

      return 0;

}

 

Значи имам една задача където трябва да намеря N! , където N>0, N<50 000 и N е цяло число. С това което съм написал работи добре с ниските числа, но като въведа N да е повече от 20 и бъгва...

При мен работи и при по-големи числа.

  • Автор

То и на мен ми тръгва, въпросът е че извежда отрицателно число при големи стойности на N, които нямат нищо общо с отговора.

Редактирано от FnTsTiC (преглед на промените)

То и на мен ми тръгва, въпросът е че извежда отрицателно число при големи стойности на N, които нямат нищо общо с отговора.

Сега остава да се сетиш ЩО ??

само един въпрос факториел не се ли смята най бързо с рекурсия?

не ми се карайте де

Ако знаех щях ли да питам тука...

Добре - още един жокер. Смени това long long с int  и пак пробвай с различни числа.

само един въпрос факториел не се ли смята най бързо с рекурсия?

не ми се карайте де

зависи, но в повечето случаи един цикъл е "по-евтин" от извикване на функция (т.е. рекурсия)

Вярно е че  записа е по-прост, но конкретно при факториал функцията не е толкова сложна :)

зависи, но в повечето случаи един цикъл е "по-евтин" от извикване на функция (т.е. рекурсия)

Вярно е че  записа е по-прост, но конкретно при факториал функцията не е толкова сложна :)

Записа на факториел е по-прост и по нативен в цикъл - дефиницията за факториел от n е произведението на числата от 1 до n (цикъл) а не произведението на n по факториел от n - 1 (рекурсия). Това че е удобен за обяснението ѝ си е отделен въпрос.

Виж дефиницията за редицата на Фибоначи е първите два елемента са 1, всеки следващ е сбор от предните два - е типично рекурсивно обяснение, макар че пак е по-лесно и добре да се реализира с цикъл.

Ако говорим за смятане на факториел в нативни цели числа, най-бързо е с лукъп таблица. баси 160 байта е.

Записа на факториел е по-прост и по нативен в цикъл - дефиницията за факториел от n е произведението на числата от 1 до n (цикъл) а не произведението на n по факториел от n - 1 (рекурсия). Това че е удобен за обяснението ѝ си е отделен въпрос.

Виж дефиницията за редицата на Фибоначи е първите два елемента са 1, всеки следващ е сбор от предните два - е типично рекурсивно обяснение, макар че пак е по-лесно и добре да се реализира с цикъл.

Ако говорим за смятане на факториел в нативни цели числа, най-бързо е с лукъп таблица. баси 160 байта е.

Освен това и цикъла е по-евтин и в друг смисъл (при факториал): предава се голямо число, което трябва да се пази в стека (при рекурсия). Докато числата на Фибоначи растат много по-бавно и може да се оптимизира размера на променливите :)

static long Factorial(long number)
        {
            if (number <= 1)
                return 1;
            else
                return number * Factorial(number - 1);
        }

Вие май не прочетохте нито един пост от дискусията по-горе. В този случай рекурсията ще е по-бавна и по-опасна (препълване на стека) от обикновен for цикъл

  • 1 година по-късно...

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.