Re: [問題] 0與1的排列組合
※ 引述《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
討論串 (同標題文章)