โปรแกรมแฟกทอเรียลใน C: จะคำนวณแฟกทอเรียลของตัวเลขได้อย่างไร?



แฟกทอเรียลของจำนวนเต็มบวกคือผลคูณของจำนวนเต็มและจำนวนเต็มทั้งหมดที่อยู่ด้านล่าง เรียนรู้การเขียนโปรแกรมแฟกทอเรียลในภาษาซีตัวอย่าง: 3! = 3 * 2 * 1

แฟกทอเรียลของจำนวนเต็มบวกคือผลคูณของจำนวนเต็มและจำนวนเต็มทั้งหมดที่อยู่ด้านล่างนั่นคือแฟกทอเรียลของจำนวน n (แทนด้วย n!) จะได้รับโดย

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





แฟกทอเรียลของ 0 ถูกกำหนดให้เป็น 1 และไม่ได้กำหนดไว้สำหรับจำนวนเต็มลบ มีหลายวิธีในการค้นหาซึ่งแสดงไว้ด้านล่าง -

มาเริ่มกันเลย.



แฟกทอเรียลใช้สำหรับลูป

เป็นวิธีที่ง่ายและง่ายที่สุดในการหาแฟกทอเรียลของตัวเลข ให้เราเข้าไปที่รหัสก่อน -

#include int main () {int I, num, fact = 1 // กำหนดแฟกทอเรียลเป็น 1 เนื่องจากค่าน้อยที่สุดคือ 1 printf (“ ป้อนตัวเลขเพื่อคำนวณแฟกทอเรียล”) 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 }

เอาท์พุท -

แฟกทอเรียลของ 5 = 120



คำอธิบาย -

จำนวนที่ต้องการหาแฟกทอเรียลจะถูกนำมาเป็นอินพุตและเก็บไว้ในตัวแปรและจะถูกตรวจสอบว่าเป็นค่าลบหรือไม่ หากจำนวนเต็มที่ป้อนเป็นค่าลบข้อความที่เหมาะสมจะปรากฏขึ้น ค่าของแฟกทอเรียลถูกกำหนดไว้ล่วงหน้าให้เป็น 1 เนื่องจากค่าต่ำสุดคือ 1 สำหรับลูปถูกเรียกใช้สำหรับจำนวนเต็มบวก (ยกเว้น 0 ที่เงื่อนไขการทดสอบเป็นเท็จและทำให้ข้อเท็จจริงยังคงเป็นศูนย์) ใน for loop ค่าของแฟกทอเรียลจะคูณกับจำนวนเต็มแต่ละตัวและเก็บไว้อย่างต่อเนื่องจนกว่าจะถึงจำนวนอินพุต ตัวอย่างเช่นสำหรับ input = 5 โฟลว์จะไปที่สำหรับลูปและทำตามขั้นตอนต่อไปนี้ -

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

ตอนนี้ 6> 5 ดังนั้นเงื่อนไขการทดสอบจึงกลายเป็นเท็จและการวนซ้ำจะสิ้นสุดลง ค่าของแฟกทอเรียลจะปรากฏขึ้น

แฟกทอเรียลโดยใช้ฟังก์ชัน

วิธีนี้เรียกว่าวิธีการแบบแยกส่วนและควรปฏิบัติตามสำหรับการเขียนโปรแกรมเนื่องจากมีประสิทธิภาพมาก ข้อดีอย่างหนึ่งคือเมื่อเราต้องการเปลี่ยนแปลงโค้ดแทนที่จะเปลี่ยนโค้ดทั้งหมดเราก็สามารถแก้ไขฟังก์ชันที่เกี่ยวข้องได้ รหัสสำหรับค้นหาแฟกทอเรียลของตัวเลขโดยใช้วิธีนี้แสดงอยู่ด้านล่าง

#include long factorial (int num) // ฟังก์ชันสำหรับการคำนวณแฟกทอเรียลซึ่งรับค่าจำนวนเต็มเป็นพารามิเตอร์และส่งกลับค่าประเภท int {int i long fact = 1 สำหรับ (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 } 

เอาต์พุต - แฟกทอเรียลของ 5 = 120

คำอธิบาย -

ตรรกะสำหรับโปรแกรมจะเหมือนกันยกเว้นว่าจะใช้ฟังก์ชันที่แตกต่างกันเพื่อคำนวณแฟกทอเรียลและส่งคืนค่าไปยังเมธอดหลักจากที่ที่การดำเนินการเริ่มต้นขึ้น

แฟกทอเรียลโดยใช้การเรียกซ้ำ

การเรียกซ้ำเป็นกระบวนการที่ฟังก์ชันเรียกตัวเองและฟังก์ชันที่เกี่ยวข้องเรียกว่าฟังก์ชันเรียกซ้ำ ประกอบด้วยสองส่วน - เงื่อนไขพื้นฐานและการเรียกซ้ำ คำตอบสำหรับเงื่อนไขพื้นฐานมีให้ในขณะที่การแก้ปัญหาค่าที่ใหญ่กว่าสามารถแก้ไขได้โดยการแปลงเป็นค่าที่น้อยกว่าจนกว่าจะถึงและใช้โซลูชันพื้นฐาน

ด้านล่างนี้เป็นรหัสสำหรับการค้นหาแฟกทอเรียลโดยใช้การเรียกซ้ำ: -

#include int fact (int) // function ต้นแบบ int main () {int num printf ('ป้อนตัวเลขที่จะหาแฟคทอเรียล:') 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 } } 

เอาต์พุต - แฟกทอเรียล 5 = 120

ค้นหาจำนวนที่มากที่สุดใน java

คำอธิบาย -สมมติว่าผู้ใช้ป้อน 5 เป็นอินพุตจากนั้นในเมธอด main () ค่าของ num คือ 5 เมื่อโฟลว์ไปในคำสั่ง printf (บรรทัดที่ 12) ฟังก์ชัน call to fact (5) จะถูกสร้างขึ้น ตอนนี้สำหรับ fact (5) num คือ 5 ซึ่งไม่เท่ากับ 0 ดังนั้นโฟลว์จึงไปที่คำสั่ง else ซึ่งในคำสั่ง return จะมีการเรียกแบบเรียกซ้ำและทำ fact (4) กระบวนการนี้ซ้ำแล้วซ้ำอีกจนกว่าเงื่อนไขพื้นฐานคือถึง num = 0 และส่งคืน 1 ตอนนี้โฟลว์ไปที่ fact (1) โดยที่ 1 (as for fact (1) num = 1) * 1 (ค่าที่ส่งคืนจาก fact (0)) จะถูกส่งกลับ กระบวนการนี้จะทำซ้ำจนกว่าจะได้ค่าที่ต้องการ

ความซับซ้อนของเวลาและอวกาศ - การวนซ้ำ V / S ซ้ำ

สำหรับการเรียกซ้ำ -

เกี่ยวกับ ความซับซ้อนของเวลา เรารู้ว่าแฟกทอเรียล 0 เป็นการเปรียบเทียบเท่านั้น ดังนั้น T (0) = 1. สำหรับแฟกทอเรียลของจำนวนอื่น ๆ กระบวนการจะเกี่ยวข้องกับการเปรียบเทียบหนึ่งตัวการคูณหนึ่งการลบหนึ่งครั้งและการเรียกใช้ฟังก์ชัน ดังนั้น

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

เนื่องจากเรารู้ T (0) = 1 และสำหรับ k = n, (n-k) = 0

ดังนั้น T (n) = T (0) + 3n
= 1 + 3n

ดังนั้นความซับซ้อนของเวลาของรหัสคือ O (n)

เกี่ยวกับ ความซับซ้อนของอวกาศ สแต็กถูกสร้างขึ้นสำหรับการเรียกแต่ละครั้งซึ่งจะคงไว้จนกว่าค่าจะเท่ากับคำนวณและส่งคืน ตัวอย่างเช่นสำหรับ n = 5 สแต็กต่อไปนี้จะต้องได้รับการดูแล

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

ดังที่เราเห็นว่าจะต้องมีการเก็บสแต็ก 5 กองไว้จนกว่าจะถึงการเรียกไปที่ f (0) ซึ่งมีค่าเป็นเป็นที่รู้จักและถูกส่งกลับ ดังนั้นสำหรับ n แฟกทอเรียลจะต้องมีการบำรุงรักษา n สแต็ก ดังนั้นความซับซ้อนของพื้นที่คือ O (n) นอกจากนี้ยังเห็นได้ชัดจากภาพด้านบนว่าสำหรับ n = 5 จะต้องมี 5 สแต็กบำรุงรักษา. ดังนั้นสำหรับ n แฟกทอเรียลจะต้องมีการบำรุงรักษา n สแต็ก ดังนั้นความซับซ้อนของพื้นที่จึงเป็น O (n)

สำหรับการทำซ้ำ -

เกี่ยวกับ ความซับซ้อนของเวลา มีการวนซ้ำ n ภายในลูปดังนั้นความซับซ้อนของเวลาคือ O (n)

เกี่ยวกับ ความซับซ้อนของอวกาศ สำหรับการแก้ปัญหาแบบวนซ้ำมีเพียงสแต็กเดียวที่ต้องได้รับการดูแลและใช้ตัวแปรจำนวนเต็ม ความซับซ้อนของปริภูมิจึงเป็น O (1)

นั่นคือทั้งหมดสำหรับบทความนี้ ฉันหวังว่าคุณจะเข้าใจแนวคิดของโปรแกรมแฟกทอเรียลในภาษา C พร้อมกับความซับซ้อนของเวลา

หากคุณพบคำถามใด ๆ อย่าลังเลที่จะถามคำถามทั้งหมดของคุณในส่วนความคิดเห็นของ“ โปรแกรมแฟคทอเรียลใน C” และทีมงานของเรายินดีที่จะตอบ