Silnia Jezyk c

klevan66
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:3
0

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

Kopiuj

#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;
}
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Szczecin
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
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:5 dni
  • Lokalizacja:Kraków
  • Postów:1694
2

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

edytowany 1x, ostatnio: szweszwe
Zobacz pozostały 1 komentarz
szweszwe
Rzeczywiście :) Przeliczyłeś na szybko w głowie? :P
kq
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.
szweszwe
Chodziło mi o to, że zauważyłeś błąd w całości. Bo że 30-krotna to nie trudno pokalkulować :)
kq
Akurat wkleiłem u siebie i zauważyłem, że zaczyna się inaczej :​D
vpiotr
Ten typ to np int[]
klevan66
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:3
0

Bardzo dziekuje za pomoc :)

AN
  • Rejestracja:ponad 14 lat
  • Ostatnio:5 miesięcy
  • Postów:125
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.