下記の事例の全パターンと、こういったマトリックス表を簡単に作る(計算) 方法(例えばC言語のソース)でわかりやすいものを教えてください。

事例:全部で7つの箱があり、1つの箱にはボール1だけを入れることができる。
1つの箱だけにボールが入ることもあるし、7つ全部の箱にボールが入ることもある。
箱にボールが入る組み合わせは何通り考えられるか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答7件)

id:kiichigo No.1

回答回数167ベストアンサー獲得回数0

ポイント15pt

http://e-words.jp/w/2E980B2E695B0.html

2進数とは 【binary number】 - 意味/解説/説明/定義 : IT用語辞典

7ビットの二進数で表せる数と同等と考えられるので

答えは2の7乗で、128通りです。

Cなら

Boxes = 7;

Ans = pow(2, Boxes );

といった感じかと(未確認

id:smileless

ありがとうございます。

何通りあるかはその考えでよいと思いますが、

その組み合わせ一覧を出力したいのです。

質問内容の「マトリックス表」とはこのことでした。

宜しくお願い致します。

2004/03/03 15:20:53
id:honey3 No.2

回答回数350ベストアンサー獲得回数0

ポイント15pt

http://www.hatena.ne.jp/1078293559#

下記の事例の全パターンと、こういったマトリックス表を簡単に作る(計算) 方法(例えばC言語のソース)でわかりやすいものを教えてください。 事例:全部で7つの箱があり、1.. - 人力検索はてな

VCで大急ぎで作ってみました。

結局7つの箱がそれぞれ0か1の2つ通りの状態が存在すると言うことで、組み合わせは2の7乗通りですので、0〜127の2進数表示みたいなもので良いのでしょうか。以下がソースです。

--8<--------------------------

#include <math.h>

#include <string.h>

voidBinString(int nValue,int nBitNum,char *pszBuf)

{

intnn;

unsigned intnBitBuf;

*pszBuf = 0;

for(nn = nBitNum - 1; nn >= 0; nn --) {

nBitBuf = nValue >> nn;

nBitBuf = nBitBuf & 0x0001;

if (nBitBuf > 0) {

strcat(pszBuf,”o”);

}

else {

strcat(pszBuf,” ”);

}

}

}

int main(int argc, char* argv[])

{

intnMax;

intnn;

charszBuf[32];

// 7つの箱の組み合わせの最大値(2の7乗通り)

nMax = (int)pow(2,7);

// 0〜最大値までの組み合わせマトリックス表示

for(nn = 0; nn < nMax; nn ++) {

BinString(nn,7,szBuf);

printf(”組み合わせ番号 %03d:[%s]¥n”,nn,szBuf);

}

return 0;

}

--8<--------------------------

id:smileless

ありがとうございます。

VCは明るくないのですが、Cとほとんど同じですね。

解析してC又はVBに移植して結果を試してみます。

2004/03/03 15:39:10
id:ohmix1 No.3

回答回数235ベストアンサー獲得回数14

ポイント14pt

http://www.hatena.ne.jp/1078293559##

下記の事例の全パターンと、こういったマトリックス表を簡単に作る(計算) 方法(例えばC言語のソース)でわかりやすいものを教えてください。 事例:全部で7つの箱があり、1.. - 人力検索はてな

#include <stdio.h>

void main(int argc, char* argv[])

{

int b1, b2, b3, b4, b5, b6, b7;

int count = 0;

for (b1 = 0; b1<=1; b1++)

for (b2 = 0; b2<=1; b2++)

for (b3 = 0; b3<=1; b3++)

for (b4 = 0; b4<=1; b4++)

for (b5 = 0; b5<=1; b5++)

for (b6 = 0; b6<=1; b6++)

for (b7 = 0; b7<=1; b7++)

{

printf(”%d%d%d%d%d%d%d¥n”, b1,b2,b3,b4,b5,b6,b7);

count++;

}

printf(”COUNT=%d¥n”, count);

}

id:smileless

ありがとうございます。

早速コンパイルして試してみます。

2004/03/03 15:39:51
id:xnissy No.4

回答回数1029ベストアンサー獲得回数203

ポイント14pt

0から127までを2進数で表示すればよいだけですよね

#include <stdio.h>

int count;

void conv(int num){

int bit;

bit = num % 2;

num = num / 2;

count++;

if(num>0) conv(num);

printf(”%d,”,bit);

}

int main (){

int i,j;

for (i=0;i<128;i++)

{

count=0;

conv(i);

for(j=count;j<7;j++)

{

printf(”0,”);

}

printf(”¥n”);

}

return 0;

}

id:smileless

ありがとうございます。

入れるボールの下図によって、左から順に

番号を振りたいと考えています。

例)2進数で表示したとき

0,0,0,0,0,0,0

0,0,0,0,0,0,1

0,0,0,0,0,1,0

0,0,0,0,0,1,1

0,0,0,0,1,0,0

0,0,0,0,1,0,1

0,0,0,0,1,1,0

→左から順に入ったボールに番号を振る。

0,0,0,0,0,0,0

0,0,0,0,0,0,1

0,0,0,0,0,1,0

0,0,0,0,0,1,2

0,0,0,0,1,0,0

0,0,0,0,1,0,2

0,0,0,0,1,2,0

このようにするにはどうしたらよいでしょうか?

2004/03/03 15:51:51
id:fcd No.5

回答回数5ベストアンサー獲得回数0

ポイント14pt

http://www.ruby-lang.org/ja/

オブジェクト指向スクリプト言語 Ruby

Rubyのように、sprintfで2進数表示ができる言語なら簡単なんですけどね。

#!/bin/env ruby

print ”Input Number of Boxes: ”

box = gets.to_i

( 2 ** box ).times{ |i| printf( ”%0#{box}b¥n”, i ) }

id:smileless

ありがとうございます。

なるほど、かなり短いコードで表すことができますね。

2004/03/03 15:52:36
id:honey3 No.6

回答回数350ベストアンサー獲得回数0

ポイント14pt

http://www.kakaku.com/

価格.com - 「買ってよかった」をすべてのひとに。

URLはダミーです。

左から番号をつけるように作ってみました。

---------------------------------

#include <math.h>

#include <string.h>

void BinString(int nValue,int nBitNum,char *pszBuf)

{

int nn;

unsigned int nBitBuf;

int nNum;

char szNumStr[8];;

nNum = 0;

*pszBuf = 0;

for(nn = nBitNum - 1; nn >= 0; nn --) {

nBitBuf = nValue >> nn;

nBitBuf = nBitBuf & 0x0001;

if (nBitBuf > 0) {

nNum ++;

sprintf(szNumStr,”%d,”,nNum);

strcat(pszBuf,szNumStr);

}

else {

strcat(pszBuf,”0,”);

}

}

}

int main(int argc, char* argv[])

{

int nMax;

int nn;

char szBuf[32];

// 7つの箱の組み合わせの最大値(2の7乗通り)

nMax = (int)pow(2,7);

// 0〜最大値までの組み合わせマトリックス表示

for(nn = 0; nn < nMax; nn ++) {

BinString(nn,7,szBuf);

printf(”組み合わせ番号 %03d:[%s]¥n”,nn,szBuf);

}

return 0;

}

---------------------------------

id:smileless

ありがとうございます。

2004/03/03 16:48:11
id:ohmix1 No.7

回答回数235ベストアンサー獲得回数14

ポイント14pt

 >→左から順に入ったボールに番号を振る。

少々トリッキーかつマジックナンバー埋め込みで申し訳ないですが、こんなのでいかがでしょうか。

説明が必要でしたらイワシに書きますが...分かります?

#include <stdio.h>

void main(int argc, char* argv[])

{

int i = 0;

for (i=0; i<128; i++) {

int bit;

int bn = 1;

for (bit=6; bit>=0; bit--) {

int b = (i & 1<<bit) ? bn++ : 0;

printf(”%d%s”, b, bit!=0 ? ”,”:”¥n”);

}

}

}

id:smileless

ありがとうございます。

簡潔ですね。大変参考になりました。

2004/03/03 18:24:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません