Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

การพิมพ์ชุดย่อยทั้งหมดของ {1,2,3,…n} โดยไม่ต้องใช้อาร์เรย์หรือลูปในโปรแกรม C


กำหนดจำนวนเต็มบวก n เราต้องพิมพ์ชุดย่อยทั้งหมดของชุด {1, 2, 3, 4,... n} โดยไม่ต้องใช้อาร์เรย์หรือลูปใดๆ

เช่นเดียวกับที่เราให้ตัวเลขใดๆ ที่บอกว่า 3 วินาที เราต้องพิมพ์เซตย่อยทั้งหมดในเซต {1, 2, 3} ซึ่งจะเป็น {1 2 3}, {1 2}, {2 3}, {1 3}, {1}, {2}, {3} { }.

แต่เราต้องทำสิ่งนี้โดยไม่ใช้ลูปหรืออาร์เรย์ใดๆ ดังนั้น การเรียกซ้ำเท่านั้นจึงเป็นวิธีที่เป็นไปได้ในการแก้ปัญหาประเภทนี้โดยไม่ต้องใช้อาร์เรย์หรือลูป

ตัวอย่าง

Input: 3
Output: { 1 2 3 }{ 1 2 }{ 1 3 }{ 1 }{ 2 3 }{ 2 }{ 3 }{ }
Explanation: The set will be {1 2 3} from which we will find the subsets
Input: 4
Output: { 1 2 3 4 }{ 1 2 3 }{ 1 2 4 }{ 1 2 }{ 1 3 4 }{ 1 3 }{ 1 4 }{ 1 }{ 2 3 4 }{ 2 3 }{ 2 4 }{ 2 }{ 3 4 }{ 3 }{ 4 }{ }

แนวทางที่เราจะใช้ในการแก้ปัญหาที่กำหนด

  • เริ่มจาก num =2^n -1 ไม่เกิน 0
  • พิจารณาการแทนค่าไบนารีของ num ด้วยจำนวนบิต n
  • เริ่มจากบิตซ้ายสุดซึ่งแทน 1 บิตที่สองแทน 2 และไปเรื่อยๆ จนถึงบิตที่ n ซึ่งแทน n
  • พิมพ์ตัวเลขที่ตรงกับบิตหากมีการตั้งค่าไว้
  • ทำตามขั้นตอนข้างต้นสำหรับค่า num ทั้งหมดจนกว่าจะเท่ากับ 0

มาทำความเข้าใจวิธีการที่ระบุไว้โดยละเอียดว่ามันทำงานอย่างไรโดยใช้ตัวอย่างง่ายๆ −

สมมติว่าอินพุต n =3 ดังนั้นปัญหาเริ่มต้นจาก num =2^3 - 1 =7

  • การแทนไบนารีของ 7 ⇒
1 1 1
  • ส่วนย่อยที่สอดคล้องกัน ⇒
1 2 3

ลบ 1 จาก num; num =6

  • การแทนแบบไบนารีของ 6 ⇒
1 1 0
  • ส่วนย่อยที่สอดคล้องกัน ⇒
1 2

ลบ 1 จาก num; num =5

  • การแทนไบนารีของ 5 ⇒
1 0 1
  • ส่วนย่อยที่สอดคล้องกัน ⇒
1
3

ลบ 1 จาก num; num =4

  • การแทนไบนารีของ 4 ⇒
1 0 0
  • ส่วนย่อยที่สอดคล้องกัน ⇒
1

ในทำนองเดียวกัน เราจะวนซ้ำจนถึง num =0 และพิมพ์ชุดย่อยทั้งหมด

อัลกอริทึม

Start
   Step 1 → In function int subset(int bitn, int num, int num_of_bits)
   If bitn >= 0
      If (num & (1 << bitn)) != 0
         Print num_of_bits - bitn
         subset(bitn - 1, num, num_of_bits);
      Else
         Return 0
      Return 1
   Step 2 → In function int printSubSets(int num_of_bits, int num)
      If (num >= 0)
         Print "{ "
         Call function subset(num_of_bits - 1, num, num_of_bits)
         Print "}"
         Call function printSubSets(num_of_bits, num - 1)
      Else
         Return 0
      Return 1
   Step 3 → In function int main()
      Declare and initialize int n = 4
      Call fucntionprintSubSets(n, (int) (pow(2, n)) -1)
Stop

ตัวอย่าง

#include <stdio.h>
#include <math.h>
// This function recursively prints the
// subset corresponding to the binary
// representation of num.
int subset(int bitn, int num, int num_of_bits) {
   if (bitn >= 0) {
      // Print number in given subset only
      // if the bit corresponding to it
      // is set in num.
      if ((num & (1 << bitn)) != 0) {
         printf("%d ", num_of_bits - bitn);
      }
      // Check the next bit
      subset(bitn - 1, num, num_of_bits);
   }
   else
      return 0;
      return 1;
}
//function to print the subsets
int printSubSets(int num_of_bits, int num) {
   if (num >= 0) {
      printf("{ ");
      // Printint the subsets corresponding to
      // the binary representation of num.
      subset(num_of_bits - 1, num, num_of_bits);
      printf("}");
      // recursively calling the function to
      // print the next subset.
      printSubSets(num_of_bits, num - 1);
   }
   else
      return 0;
      return 1;
}
//main program
int main() {
   int n = 4;
   printSubSets(n, (int) (pow(2, n)) -1);
}

ผลลัพธ์

{ 1 2 3 4 }{ 1 2 3 }{ 1 2 4 }{ 1 2 }{ 1 3 4 }{ 1 3 }{ 1 4 }{ 1 }{ 2 3 4 }{ 2 3 }{ 2 4 }{ 2 }{ 3 4 }{ 3 }{ 4 }{ }