Silnia Jezyk c

Odpowiedz Nowy wątek
2019-10-31 17:35
0

Co mam zrobic zeby np dla n=100 nie dawalo mi 0. Jestem nowy w programowaniu.



#include <stdio.h>
int main()
{
    long long int n, i;
    long long int silnia = 1;
    printf("Podaj z jakiej liczby chcesz obliczyc silnie\n");
    scanf("%lld",&n);
    if (n < 0)
        printf("Nie ma silni z liczby ujemnej\n");
    else
    {
        for(i=1; i<=n; ++i)
        {
            silnia *= i;
        }
        printf("Silnia z %lld = %lld\n", n, silnia);
    }
    return 0;
}

Pozostało 580 znaków

2019-10-31 17:40
4

100! składa się ze 158 cyfr w zapisie dziesiętnym - to daleko poza standardowymi możliwościami obliczeniowymi.

Szukaj informacji pod kątem c big numbers.


edytowany 1x, ostatnio: Patryk27, 2019-10-31 17:40

Pozostało 580 znaków

2019-10-31 17:41
kq
1

Użyj biblioteki do big intów. Nie jestem pewien, ale dla 100 chyba double jeszcze może dać precyzyjny wynik.

Jednak się nie da.
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 / 297 = 588971222367687651371627846346807888288472382883312574253249804256440585603406374176100610302040933304083276457607746124267578125
liczba czynników pierwszych równych 2 dla liczb [2,100] to 97, więc mantysę można przesunąć max o 97 bitów bez straty precyzji. Jednocześnie pozostaje liczba 128-bitowa, więc za duża dla double'a.


edytowany 1x, ostatnio: kq, 2019-10-31 17:48

Pozostało 580 znaków

2019-10-31 17:43
2

Znaleźć typ który pomieści taką wielką liczbę. Zobacz sobie zakresy zmiennych.
100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

edytowany 1x, ostatnio: szweszwe, 2019-10-31 17:50
Zjadłeś Pan 9 ;​) (bardziej bezczelnie mówiąc: pomyłka 30-krotna!) - kq 2019-10-31 17:49
Rzeczywiście :) Przeliczyłeś na szybko w głowie? :P - szweszwe 2019-10-31 17:51
Jak reszta jest bez zmian to różnica ± taka jak między 3 a 93 :​) a jak wziąć 33 vs 933 to już właściwie wystarczająca dokładność dla człowieka. - kq 2019-10-31 17:52
Chodziło mi o to, że zauważyłeś błąd w całości. Bo że 30-krotna to nie trudno pokalkulować :) - szweszwe 2019-10-31 17:55
Akurat wkleiłem u siebie i zauważyłem, że zaczyna się inaczej :​D - kq 2019-10-31 17:55
Ten typ to np int[] - vpiotr 2019-10-31 18:18

Pozostało 580 znaków

2019-10-31 17:44
0

Bardzo dziekuje za pomoc :)

Pozostało 580 znaków

2019-10-31 17:48
0

Przekraczasz zakres dla long long int, tak gdzieś przy silnia z 24.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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