Problem z wynikiem obliczania silni

0

Cześć,
Bawię się w programowanie od... 2tyg także proszę o wyrozumiałość. Próbuję zrobić programik konsolowy do liczenia silni na różne sposoby. Poniżej jest mój kod, który się nie wykonuje poprawnie. Tzn nie do końca rozumiem dlaczego tak się dzieje. Kombinowałem z typami zmiennych ale dalej lipa, wyniki są jakieś kosmiczne a ja nie wiem dlaczego. Wg. tego co napisałem sobie na kartce (krok, po kroku) powinno to działać ale w praktyce lipa...

#include <iostream>

using namespace std;

int main()
{
    cout << "wpisac n: ";
    int n;
    int silnia; // dla małych liczb
    cin >> n;

    if((n == 1)  || (n == 0))
        {
        cout<<"silnia wynosi 0";
        }
    else
    {
    for(int i=1; i<=n; i++) // tutaj gdzies jest blad
  silnia=silnia*i;
    }
    cout<<"Silnia z liczby "<<n<<" wynosi "<<silnia<<endl;
return 0;
}

Dla Was to pewnie pikuś a ja już siedzę pare godzin na szukaniu przyczyny i coś mi nie wychodzi ;)
Z góry dzięki za pomoc :)

0

Kod jest ok, ale wiesz że silnia rośnie bardzo bardzo szybko? unsigned long long int pomieści raptem 21! ;)

1

A jaka jest początkowa wartość zmiennej silnia? Odpowiedź: nie wiadomo. Może 0, może 2893728, a może -234235235. A powinna być 1. Dlatego zrób: int silnia = 1;. Zapamiętaj: (praktycznie) zawsze inicjalizuj zmienne!

Poza tym silnia 0 to nie jest 0 tylko 1.

0

Tak, jasne że 0!=1, mój błąd :)

Czemu silnia ma być 1? przypisałem do silnia wartość 1 i działa ale nie rozumiem dlaczego tak.

Dzięki w każdym razie :)

0

Jeszcze jedno, jeśli silnia zadeklaruje jako int to od 5! jest błąd, zmieniłem na long int i teraz działa.

0

A co pokazuje przy wpisaniu -1 ?

0

Wtedy wyświetla 1...

0

Dzięki :)

Zostawiam poprawiony kod dla potomnych :)

#include <iostream>

using namespace std;

int main()
{
cout << "wpisac n: ";
unsigned int n;
long long int silnia=1;
cin >> n;

    if((n == 1)  || (n == 0))
        {
        cout<<"silnia wynosi 1";
        }
    else
        {
        for(int i=1; i<=n; i++)
        silnia=silnia*i;
        }
cout<<"Silnia z liczby "<<n<<" wynosi "<<silnia<<endl;

return 0;
}
1

Można jeszcze nieco uprościć:

#include <iostream>
using namespace std;
 
int main()
  {
   cout << "wpisac n: ";
   unsigned int n;
   cin>>n;
   unsigned long long silnia=1;
   while(n>1) silnia*=n--;
   cout<<"Silnia z liczby "<<n<<" wynosi "<<silnia<<endl; 
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1