Problem z Silnia C++

0

Problem z skryptem, gdyż silnia działa normalnie do 12 a dalsze liczby wyświetlają jakąś niepoprawny wynik.

#include <stdio.h>

int main()
{
    int silnia = 1;
    int n;
    printf("Podaj liczbe:");
    scanf("%d", &n);
    for (int i=1;i<=n;i++) silnia*=i;    
    printf("silnia = %d", silnia);
    return 0;
}

z góry dziekuje za pomoc i rady.

2

Zmienna typu int nie jest w stanie zmieścić w sobie tak dużego wyniku. Tutaj masz listę dla poszczególnych typów: https://docs.microsoft.com/pl-pl/cpp/c-language/cpp-integer-limits?view=msvc-170

0

13! == 6227020800 natomiast maksymalna wartość jaką int może przechować w systemach LP64 (*nix)/LLP64 (Windows) to 2147483647. Prawie 3 razy za mało miejsca.

0

To musiałbym zapisać to w double /long double co nie?

0

double jest zmiennoprzecinkowa, więc odpada. Jak ma być "dowolna" wartość silni to weź jakiegoś biginta.

0

@kq: a jak zastosować biginta? Wiem głupie pytanie, ale troche lajkiem programowania jestem ale staram się coś uczyć. A w technikum informatycznym uczą aby jak couty robić i document write.

0

Na obecnym poziomie bym sobie odpuścił i użył uint64_t, który ma zakres 64-bitowy i pomieści wynik 20!

Dla big intów zainteresuj się Boost.Multiprecision, ale wnioskując po pytaniu i postach, jeszcze nie ten poziom.

0

@kq: Dzięki. Poczytam dowiem się czegoś o tym i wtedy popróbuje.

1
Anonek napisał(a):

@kq: a jak zastosować biginta? Wiem głupie pytanie, ale troche lajkiem programowania jestem ale staram się coś uczyć. A w technikum informatycznym uczą aby jak couty robić i document write.

Jeśli chcesz dobry język do obliczeń, to Python będzie lepszym wyborem.
On biginta ma w standardzie.

>>> import math
>>> math.factorial(20)
2432902008176640000
>>> math.factorial(25)
15511210043330985984000000

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