如何得到某集合的所有子集合

2021-08-21 22:52:13 字數 1210 閱讀 3636

我們都知道,乙個含n個元素的集合擁有2^n個子集合,並且不難發現,其中每個子集合都是從0到2^n-1 每個數的二進位制格式中0 放棄,1選擇的結果,如下所示:

{}           000

100010

110001

101011

111所以根據數字的二進位制轉換,可以輕鬆獲得乙個集合的所有子集合,**如下:

sub getall(byval mycollection as string, byref result() as string)

dim x() as string

x = split(mid(mycollection, 2, len(mycollection) - 2), ",")

dim a() as string, b() as integer '臨時陣列

dim n as integer ' 集合元素個數

dim i as long '迴圈變數

dim num as integer '子集合元素個數

dim temp as integer '二進位制轉換中間變數

n = ubound(x) + 1

redim b(0 to n - 1)

redim result(2 ^ n - 1)

debug.print "集合 " & mycollection & " 共有子集合 " & 2 ^ n & " 個!"

for i = 0 to 2 ^ n - 1

temp = i

num = 0

for j = 0 to n - 1 '轉換為二進位制

b(j) = temp and 1 '0 or 1

temp = temp \ 2

if b(j) = 1 then

num = num + 1

redim preserve a(1 to num)

a(num) = x(j)

end if

next

result(i) = "" '結果儲存

debug.print result(i) '輸出

next

msgbox "ok"

end sub

private sub command1_click()

dim s() as string

getall "", s

end sub

輸出:集合 共有子集合 64 個!

{}

輸出乙個集合的所有子集合

面試遇上了這個問題,思量了會,想到用遞迴的方式解決這個問題。回來網上搜尋了下,發現通過二進位制的思想來解決這個問題更容易,下面我把兩種解決方式的思想及原碼分享出來。我們都知道,乙個含n個元素的集合擁有2 n個子集合,並且不難發現,其中每個子集合都是從0到2 n 1 每個數的二進位制格式中0 放棄,1...

子集合問題,排列出所有子集組合

想了好幾天,網上也沒有給出具體方法,索性就自己寫了乙個,但是效率不是很高,可以根據需求進行優化 public static void subset int arr,int target,list alllist else 遞迴結果集 public static void recursion int ...

素因子集合

題目詳情 小強最近在學初等數論,老師給他們出了乙個課後習題,那就是給你兩個正整數a,b 0 輸入描述 輸入包含多組測試資料,每組測試資料報含兩個正整數a,b,以檔案結束。輸出描述 對於每組測試資料如果a和b的素因子集合相同則輸出 yes 否則輸出 no 答題說明 輸入樣例 2 84 9 10 50 ...