Problem z liczeniem silni

0

Screen:
http://prntscr.com/gubjp0

Może mi ktoś wytłumaczyć, czemu program działa poprawnie tylko dla liczb 1-12, ale już 13+ robią się jakieś cuda...

Dopiero zaczynam swoją przygodę z programowaniem (tak gdzieś od wczoraj) :P

#include <iostream>

using namespace std;
int n, x, y;
int main()
{
    cout << "Program obliczajacy wartosc silni dla wskazanej liczby." <<endl;
    cout << "Aby zakonczyc wpisz 0." << endl;
    cout << endl;
    do
    {
        cout << "Podaj liczbe: ";
        cin >> n;
        y=0;
        x=n;
        if (n>=1)
        {
            do
            {
                y=y+1;
                cout << n << "! = " << x << "*(" << n << "-" << y << ")"<< endl;
                x=x*(n-y);
            }while (y!=n-1);
        }
        else
        {
            return 0;
        }
        cout << n << "! = " << x << endl;
        cout << endl;
    } while (n);
    return 0;
}

Da się to obejść?

1

Podpowiem jeszcze:
Sprawdź jaką maksymalną wartość przyjmuje zmienna typu int. :)
Aby rozwiązać problem musisz użyć zmiennej np typu 'unsigned long long'.

1

Tu działa dobrze do 20, dalej nie chce mi się sprawdzać ale pewnie nie wiele więcej i będzie źle

#include  <iostream>

int main()
{
	int64_t wynik = 1;
	int liczba = 20;
	for (int i = 1; i <= liczba; i++) {
		wynik = wynik*i;
	}
	std::cout << wynik;
	
}

Wszystko przez zakresy zmiennych, poszukaj jakiejś zmiennej o większym zakresie

0

Zmienna danego typu w komputerze to nie jest liczba, to klatka na liczby z zakresu od do. Wpisz sobie w Wikipedia "c data types" I Sprawdz dokladnie z wolfram alpha na przyklad.

0

Jak potrzebujesz program liczący silnię z dużych liczb to łatwo będzie to zrobić w pythonie, pamiętam że bez problemu i poprawnie liczyłem w nim silnię n 52 większych liczb nie potrzebowałem ale myślę że dałby radę.

0

@przemyslowiec, potwierdzam. Poniższy kod liczy 1000! poprawnie, czas obliczeń i wypisywania jest praktycznie równy zero.

s = 1
i = 1
while i<=n:
   s*=i
   i+=1
print("%d! = %d" % (n,s))

Można też skorzystać z funkcji bibliotecznej:

from math import factorial
print("%d! = %d" % (n,factorial(n)))
0

W C++ nie jest to bardzo skomplikowane:
https://wandbox.org/permlink/byFlTfh2vsKNNPYj

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