Problem z silnia w jezyku c

0

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

int wyn,n,x,s;
wyn=0;

printf("OBLICZANIE SILNI Z LICZBY N \n");
printf("Podaj liczbe, ktorej silnie chcesz obliczyc \n");
scanf("%d",&n);

if (n==0)
{
printf("n! z 0 wynosi 1 \n");
}
else if (n<0)
{
printf("Wpisales liczbe ujemna, z ktorej nie mozna obliczyc n! \n");
}
else
{

 x=1; 

do
{

               wyn=n*x;
               s=wyn;
               x++;

}
while(x<n);

               printf("n! z %d=%d \n",n,s);
               

}

system("PAUSE");
return 0;
}
Co jest zle w tym kodzie ze zamiast liczyc silnie bierze n odejmuje jeden i mnozy jedno przez drugie? Prosze o odpowiedz ,ale nie typu ze program jest zalosny itp. to sa naprawde dopiero moje poczatki i nie wiem co jest zle. I jezeli ktos moglby mi wytlumaczyc kiedy zerowac wynik a kiedy nie tez bylbym wdzieczny. A co do szukania w internecie rozwiazania wiekszosc rzeczy jest w c++.

0
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int wynik,n,i;
    wynik=1;
    printf("OBLICZANIE SILNI Z LICZBY N \n");
    printf("Podaj liczbe, ktorej silnie chcesz obliczyc \n");
    scanf("%d",&n);
    if (n<0)
        printf("Wpisales liczbe ujemna, z ktorej nie mozna obliczyc n! \n");
    else
    {
        i=n; //będziemy mnozyć aktualny wynik przez "i" i zmniejszać "i" o 1 w każdej iteracji
        while(i>0)
            wynik*=i--;
        printf("%d! wynosi %d \n",n,wynik);
    }
    system("PAUSE");
    return 0;
}
0

Dzieki wielkie. Ale mozesz wytlumaczyc dokladnie co oznacza ten zapis wynik*=i--?

0

To jest taki skrócony zapis czegoś takiego:

wynik = wynik * i; //aktualny wynik mnożymy przez liczbę "i"
i=i-1; //zmniejszamy liczbę przez którą mnożymy, bo z definicji silni mnożymy przez coraz mniejsze liczby -> n*(n-1)*(n-2)*...*2*1
//w pierwszej iteracji mamy np.
//wynik = 1*6=6
//w drugiej:
//wynik = 6*5=30
//w trzeciej
//wynik = 30*4=120
//itd
0

@Shalom, przed chwilą Twój program radośnie oświadczył, że 17! wynosi -288522240.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int wynik,n,i;
    wynik=1;
    printf("OBLICZANIE SILNI Z LICZBY N \n");
    printf("Podaj liczbe, ktorej silnie chcesz obliczyc \n");
    scanf("%d",&n);
    if (n<0)
        printf("Wpisales liczbe ujemna, z ktorej nie mozna obliczyc n! \n");
    else if (n>12)
        printf("Wpisales za duza liczbe, najwieksza dopuszczalna to 12 \n");
    else
    {
        i=n; //będziemy mnozyć aktualny wynik przez "i" i zmniejszać "i" o 1 w każdej iteracji
        while(i>0)
            wynik*=i--;
        printf("%d! wynosi %d \n",n,wynik);
    }
    //system("PAUSE");
    return 0;
}
0

@bo

wiesz co to zakres zmiennej :P?

0

Ja wiem co to zakres zmiennej, ale być może nie wie autor wątku, a tym bardziej może nie wiedzieć użytkownik programu. Nie wolno wyświetlać wyniku, który jest niepoprawny. Każdy (mam nadzieję) zauważy, że wartość ujemna dla 17! jest błędna. Błąd w zdaniu 13! wynosi 1932053504 zauważyć już trochę trudniej.

0
  1. Program nie jest mój, a autora :P Ja go tylko poprawiłem ;)
  2. To oczywiście prawda że dla większych wartości będzie błąd, ale to już niech sobie autor sam obsługuje ;]
0

Poprawa nie jest znacząca ;) . Oryginalny program liczył dobrze dla n<=3, Twój dla n<=12.

0

Zastosuj unsigned long long int ^^.

0

.. i wtedy program zadziała poprawnie do 21! ;]

0

To blad wynika z tego ze zmienne sa zle zadeklarowane czyj jak? ;p to jak to zadeklarowac zeby dobrze liczylo duze liczby? Znaczy sie blad w tym poprawionym programie bo wiem ze moj jest ogolnie niepoprawny.

0

Problem wynika z tego że zmienne maja z definicji ograniczony rozmiar. Zmienna typu int ma z reguły 4 bajty, czyli jest w stanie przechować 232 różnych liczb, więc zakładając tylko liczby dodatnie mamy co najwyżej 0-4294967296. long long int ma z reguły 8 bajtów, czyli przechowa 264 różnych liczb, czyli 0-18446744073709551616 (a to jest w stanie przechować tylko 21!). Ogólnie silnia jest bardzo szybko rosnącą funkcją i jeśli chcesz mieć możliwość liczenia większych wartości to musisz napisać własne operacje liczbowe na stringach.

0

Trochę się przyczepię.
Zakres 0-18446744073709551616 jest niewystarczający bo obliczyć
21! = 51090942171709440000.

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