Program czynnikowy w C: Jak obliczyć silnię liczby?



Silnia dodatniej liczby całkowitej jest iloczynem liczby całkowitej i wszystkich liczb całkowitych pod nią. Naucz się pisać program silni w C. Przykład: 3! = 3 * 2 * 1

Silnia liczby całkowitej dodatniej jest iloczynem liczby całkowitej i wszystkich liczb całkowitych poniżej niej, tj.silnia liczby n (reprezentowanej przez n!) Byłaby dana przez

n! = 1 * 2 * 3 * 4 *. . . . . * n





Silnia 0 jest definiowana jako 1 i nie jest definiowana dla ujemnych liczb całkowitych. Istnieje wiele sposobów, aby go znaleźć, które są wymienione poniżej:

Zacznijmy.



Silnia za pomocą pętli For

Jest to najłatwiejszy i najprostszy sposób na znalezienie silni liczby. Najpierw zajrzyjmy do kodu -

#include int main () {int I, num, fact = 1 // definiowanie silni jako 1, ponieważ najmniejsza wartość to 1 printf ('Wprowadź liczbę, aby obliczyć silnię') scanf ('% d', & num) if (num<0) //if the input is a negative integer { printf (“Factorial is not defined for negative numbers.”) } else { for(i=1i0, therefore fact value remains 1 { fact = fact * i // keeps on multiplying and storing in the value of factorial till the input integer is reached } printf(“Factorial of %d = %dn”, num, fact) } return 0 //since we have defined the main() method with a return value of integer type }

Wynik-

Silnia 5 = 120



Wyjaśnienie -

Liczba, której silnia ma zostać znaleziona, jest przyjmowana jako dane wejściowe i przechowywana w zmiennej oraz sprawdzana, czy jest ujemna, czy nie. Jeśli wprowadzona liczba całkowita jest ujemna, zostanie wyświetlony odpowiedni komunikat. Wartość silni jest wstępnie zdefiniowana jako 1, ponieważ jej najmniejsza wartość to 1. Pętla for jest wykonywana dla dodatnich liczb całkowitych (z wyjątkiem 0, dla którego warunek testu jest fałszywy, a zatem fakt pozostaje zerowy). W pętli for wartość silni jest mnożona przez każdą liczbę całkowitą i przechowywana sukcesywnie, aż do osiągnięcia liczby wejściowej. Na przykład, dla wejścia = 5, przepływ przechodzi do pętli for i mają miejsce następujące kroki:

fakt = 1, i = 1 -> fakt = 1 * 1 = 1 -> i = 2
Fakt = 1, i = 2 -> fakt = 1 * 2 = 2 -> i = 3
Fakt = 2, i = 3 -> fakt = 2 * 3 = 6 -> i = 4
fakt = 6, i = 4 -> fakt = 6 * 4 = 24 -> i = 5
fakt = 24, i = 5 -> fakt = 24 * 5 = 120 -> i = 6

jaka jest struktura danych w java

Teraz 6> 5, dlatego warunek testowy staje się fałszywy i pętla jest zakończona. Wyświetlana jest wartość silni.

Silnia przy użyciu funkcji

To podejście jest znane jako podejście modułowe i powinno być stosowane podczas programowania, ponieważ jest dość wydajne. Jedną z jego zalet jest to, że kiedy musimy wprowadzić zmiany w kodzie, zamiast zmieniać cały kod, możemy po prostu zmodyfikować odpowiednią funkcję. Kod służący do znajdowania silni liczby przy użyciu tego podejścia przedstawiono poniżej

#include long factorial (int num) // funkcja obliczająca silnię, która przyjmuje wartość całkowitą jako parametr i zwraca wartość typu int {int i long fact = 1 for (i = 1 i<= num i++) fact = fact * i return fact //returns to function call } int main() //execution begins from main() method { int num printf('Enter a number to calculate its factorialn') scanf('%d', &num) if(num<0) //if the input is a negative integer { printf('Factorial is not defined for negative numbers.') } printf('Factorial of %d = %dn', num, factorial(num)) //call to factorial function passing the input as parameter return 0 } 

Wynik - Silnia 5 = 120

Wyjaśnienie-

round double to int java

Logika programu jest taka sama, z wyjątkiem tego, że do obliczenia silni i zwrócenia wartości do metody głównej, z której rozpoczyna się wykonywanie, używana jest inna funkcja.

Silnia przy użyciu rekursji

Rekursja to proces, w którym funkcja wywołuje samą siebie, a odpowiadająca jej funkcja jest nazywana funkcją rekurencyjną. Składa się z dwóch części - warunku podstawowego i wywołania rekurencyjnego. Dostarczane jest rozwiązanie warunku podstawowego, podczas gdy rozwiązanie dla większej wartości można rozwiązać, konwertując na mniejsze wartości, aż do osiągnięcia i użycia rozwiązania podstawowego.

Poniżej znajduje się kod do znajdowania silni przy użyciu rekurencji: -

#include int fact (int) // function prototype int main () {int num printf ('Wpisz liczbę, której silnia ma zostać znaleziona:') scanf ('% d', & num) if (num<0) { printf('ERROR. Factorial is not defined for negative integers') } printf('Factorial of %d is %d', num, fact(num)) //first call is made return 0 } int fact(int num) { if(num==0) //base condition { return 1 } else{ return(num*fact(num-1)) //recursive call } } 

Wynik - Silnia 5 = 120

Wyjaśnienie -Załóżmy, że użytkownik wprowadzi 5 jako dane wejściowe, a następnie w metodzie main () wartość num wynosi 5. W trakcie przepływu instrukcji printf (wiersz 12) następuje wywołanie funkcji fact (5). Teraz dla fact (5) num jest 5, co nie jest równe 0, więc przepływ przechodzi do instrukcji else, w której w instrukcji return wykonywane jest wywołanie rekurencyjne, a wykonywany jest fakt (4). Proces jest powtarzany aż do osiągnięcia warunku podstawowego, tj. Num = 0, i zwrócenia 1. Teraz przepływ idzie do fact (1), skąd zwracane jest 1 (jak dla fact (1) num = 1) * 1 (wartość zwracana z fact (0)). Ten proces powtarza się, aż do uzyskania wymaganej wartości.

Złożoność czasu i przestrzeni - iteracja rekurencyjna V / S

Dla rekursji

Jeżeli chodzi o złożoność czasowa , wiemy, że jedynym porównaniem jest silnia 0. Dlatego T (0) = 1. W przypadku silni dowolnej innej liczby proces obejmuje jedno porównanie, jedno mnożenie, jedno odejmowanie i jedno wywołanie funkcji. W związku z tym

T (n) = T (n-1) +3
= T (n-2) +6
= T (n-3) +9
= & hellip.
= T (n-k) + 3k

Ponieważ wiemy, że T (0) = 1 i dla k = n, (n-k) = 0

Dlatego T (n) = T (0) + 3n
= 1 + 3n

Dlatego złożoność czasowa kodu wynosi O (n).

Jeżeli chodzi o złożoność przestrzeni, dla każdego wywołania tworzony jest stos, który będzie utrzymywany aż do osiągnięcia jego wartościobliczone i zwrócone. Na przykład dla n = 5 należy zachować następujące stosy

f (5) -> f (4) -> f (3) -> f (2) -> f (1) -> f (0)

Jak widać, trzeba będzie utrzymać 5 stosów, dopóki nie zostanie osiągnięte wywołanie funkcji f (0), której wartość wynosiznane i zwracane. Dlatego dla n silni trzeba będzie zachować n stosów. Stąd złożoność przestrzenijest O (n). Z powyższych zdjęć wynika również, że dla n = 5 będzie musiało być 5 stosówutrzymany. Dlatego dla n silni trzeba będzie zachować n stosów. Zatem złożoność przestrzeni wynosi O (n).

Do iteracji

Jeżeli chodzi o złożoność czasowa, istnieje n iteracji wewnątrz pętli, dlatego złożoność czasowa wynosi O (n).

szerokość pierwszego algorytmu wyszukiwania pseudokod

Jeżeli chodzi o złożoność przestrzeni, dla rozwiązania iteracyjnego jest tylko jeden stos, który musi być utrzymany i używana jest zmienna całkowita. Zatem złożoność przestrzeni wynosi O (1).

To wszystko w tym artykule. Mam nadzieję, że zrozumiałeś koncepcję programu silni w C wraz ze złożonością czasową.

Jeśli natkniesz się na jakieś pytania, nie wahaj się zadać wszystkich pytań w sekcji komentarzy w „programie silni w C”, a nasz zespół z przyjemnością odpowie.