Re: [問題] 0與1的排列組合

看板C_and_CPP作者 (十三)時間14年前 (2009/09/26 15:21), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/5 (看更多)
※ 引述《liu2007 (薯)》之銘言: : 好煩呀 : 這個是一個作業 : 題目就是:輸入一個數字n(正整數) :  請排列出n個位元的0101的排列組合 :  不可使用 0,1,2,3,4,5,6.....的方式累加轉二進制補零的方式 :  也不可以使用任何除2進位之類有的沒有的方法 :  只能:0個1的排列、1個1的排列、2個1的排列.....n個1的排列 : 印象中老師說可以用遞迴寫..... : 可是我不知道要怎麼樣往終止條件靠近..... : 有想法但是程式碼就是想不出來.... : 不知道有沒有鄉民可以幫我一把..... : 希望我的說明大家可以看的董 終止條件不就是全1?或是算個數 如果你真的那麼想要遞迴的話... 提供byte level很爛的解法 你可以Q的更好 #include <stdio.h> void cal(char *a,int b,int s,int i,int e,int *c) { if (i==e) { a[i]=48; printf("%s %d\n",a,(*c)++); a[i]=49; printf("%s %d\n",a,(*c)++); if(s>b && ((*c)>>(e-s+1))&1==1) { a[s--]=48; a[s]=49; cal(a,b,s,s+1,e,c); a[s]=48; } } else { a[i]=48; cal(a,b,s,i+1,e,c); a[i]=49; cal(a,b,s,i+1,e,c); a[i]=48; } } int main() { int c; char a[11],*p; for (p=a+10;p>=a;p--) *p=48; c=a[10]=0; cal(a,6,9,9,9,&c); return(0); } a是輸出字串 b是由右往左數bit (10-b) 這意味著如果你可以顯示(10-b)位數 s是最左邊的1,左邊界 i是切換0與1並向右往e的方向作遞迴 e是右邊界 c是計算此二進位的值 PS.改一改code就可以輸出32 bit, 爛!! -- World of bleed1979 http://bleed1979.myweb.hinet.net/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.177.97
文章代碼(AID): #1AlS3zlF (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1AlS3zlF (C_and_CPP)