=得点の付け方=
連続した3つの数=5点
連続した2つの数=4点
1つ間のあいた3つの数=3点
1つ間のあいた2つの数=2点
どこにもくつかない数=0点

(23345)→(234)(35)の7点 or (23)(345)の7点
(24468)→(246)(4)(8)の3点 or (24)(468)の5点

組み合わせの取り方で得点が異なり、最大得点を得るためにはどういった
ように考えればよいのでしょう?

A 回答 (2件)

>こういったcom関数を作りたいのですがどうやったらいいのか分かりません。



あまり良いコードではないかもしれませんが、参考にしてください。com の引数 n と r は nCr を意味します。作成される y は、8C3 の時に、
x = { 1, 2, 3, 4, 5, 6, 7, 8 }
y[0] = 1
y[1] = 2
y[2] = 3
y[3] = 1
y[4] = 2
y[5] = 4
y[6] = 1
y[7] = 2
y[8] = 5
という順番になります。

int *y;// y は int[nCr * r] のメモリが確保されている必要がある
int *x;// x は int[n] のメモリが確保されていて、適当に初期化されている必要がある

void com(int n, int r)
{
com_sub(y, 0, 0, n, r);
}

int *com_sub(int *write, int start, int nest, int n, int r)
{
int i, c;
if (nest < r)
{
for (i = start; i <= n - r + nest; i++)
{
if (i != start)
{
for (c = 0; c < nest; c++)
{
*write++ = *(write - r);
}
}
*write = x[i];
write = com_sub(write + 1, i + 1, nest + 1, n, r);
}
}
return write;
}


おそらく、あらかじめ組み合わせリストを作成するよりも、再帰的に総当たりしていって、得点が以前のものを上回ったときに、その組み合わせを保存するようなコードを作成したほうがシンプルになると思います。
    • good
    • 0

体系化された得点配分ではないので、全部の組み合わせを試すのが最良の方法と思われます。

例示されている通りに5つの数字に対する得点を考えるとすれば、その組み合わせ数は、
 (3つの数字の組み合わせ、2つの数字の組み合わせ) = 10通り
 (3つの数字の組み合わせ、1つの数字、1つの数字) = 10通り
 (2つの数字の組み合わせ、2つの数字の組み合わせ、1つの数字) = 15通り
 (2つの数字の組み合わせ、1つの数字、1つの数字、1つの数字) = 10通り
 (全部1つの数字) =1通り
となり、合計46通りを調べれば済みます。プログラムで組むとすれば、簡単な話ですね。

以上。

この回答への補足

x[8]={0,1,2,5,6,7,8,10};
com(8,3);/*組み合わせy[]に入れる関数*/

y[0]={0,1,2};
y[1]={0,1,5};
y[2]={0,1,6};
・・・
y[8C3-1]={7,8,10};

こういったcom関数を作りたいのですがどうやったらいいのか分かりません。
助言をお願いします。com(int x,int y)といったように一般化してです。

補足日時:2002/02/16 20:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q※「gyou[1024];=1 行のバイト数がそれ以下であれば問題ない」

https://oshiete.goo.ne.jp/qa/8940272.html
 以上のアドレス先のプログラムのコメントに
 ※「gyou[1024];=1 行のバイト数がそれ以下であれば問題ない」
 と書き込んでしまいました。
  すると!プログラムは、行数を計算するプログラムですが、
そのプログラムの行数は22行ありますが、その中の一番多い行の文字数は半角40文字あります。
 40文字×1バイト=5120ビットになります。
  なので 
上記の※は最大1024ビットですので、対応できない計算になると思います。
 しかし、プログラムはちゃんと動いていますので!私のどこが間違っている
か知りたいです。
 よろしくお願いいたします。

Aベストアンサー

えーと、そもそもバイトとビットの理解自体が曖昧みたいですが・・・σ(^_^;)

「1バイト = 8ビット」と言うのは固定のお約束です
んで、8ビットというのは2進数で数値を表すってことです
つまり8桁の2進数 00000000 〜 11111111
の256パターンで0から255の値を表現できます
これは C言語ファミリーでは unsigned char と宣言したときで
char と宣言すると符号付きとなり1ビットを符号状態に使うため
7桁の2進数 0000000 〜 1111111
の128パターン x 符号状態 でー127から+128まで表現できるわけです
ちなみになんでー127って+より1少ないかといえば0があるから
ここは理解できてますか?

で肝心の配列ですが・・・
 gyou char[1024];
これの意味は
「符号付き1バイトが1024個並んだ領域を確保し、先頭をgyouと言う名前で参照します」
ので gyou[0] だろうが gyou[100] だろうが1バイトなのです
添字は0から始まるのでこの場合のMAXは1023ですな

0 1 2 3・・・・・・・・・・1023
↓↓↓↓・・・・・・・・・・↓
□□□□・・・・・□□□□□□

gyou

)最後に個人的な思い込みの助言
どのような参考書をお使いか知りませんが
C言語を勉強するなら1度はK&Rの本を読んどくべきかと
全ての原点はそこにあります

えーと、そもそもバイトとビットの理解自体が曖昧みたいですが・・・σ(^_^;)

「1バイト = 8ビット」と言うのは固定のお約束です
んで、8ビットというのは2進数で数値を表すってことです
つまり8桁の2進数 00000000 〜 11111111
の256パターンで0から255の値を表現できます
これは C言語ファミリーでは unsigned char と宣言したときで
char と宣言すると符号付きとなり1ビットを符号状態に使うため
7桁の2進数 0000000 〜 1111111
...続きを読む

QC言語についてです 5人のテストの点数を入力すると 合計点、平均点、最高点、最低点を 出力するプログ

C言語についてです
5人のテストの点数を入力すると
合計点、平均点、最高点、最低点を
出力するプログラムを作成したいのですが
うまくできませんでした
なぜでしょうか?

Aベストアンサー

> int score[5], goukei,max,min = 0, i;
→ int score, goukei = 0, max = 0, min = 100, i;

> if (max < score[i])
> {
> max = score[i];
> }
→ if (max < score)
→ {
→  max = score;
→ }

> if (min > score[i])
> {
> min = score[i];
> }
→ if (min > score)
→ {
→  min = score;
→ }

QC言語の ^= ついて

C言語初心者です。
ソースを読んでいたんですが、
     a[i][j] ^= rk[i][j];
のようなコードが出てきたのですが、^= ってなんですかね?

基本的な様な事ですみませんがお教え願えないでしょうか。
お願いします。

Aベストアンサー

通常の二項演算子の ^ ならわかりますか?
それの代入形式の演算子です。

具体的には「ビットごとのxor (排他的論理和)」を取る演算子です。

QVisual C++ or C# or BASIC .NET

現在Visual C++.NETを勉強しています。本屋へ行くとむしろBASICやC#の本が多いように気がします。
c++よりBASICやC#の方が人気があるのでしょうか?
そこで、これら3つの中で今後勉強していくにはどれが良いと思いますか?良いと思うものを勉強したいです。よろしくお願いいたします。

Aベストアンサー

まず根本的に違うのは
VB.net C#はFrameworkのソフトしか作れません。
逆にVC++を使ってFrameworkのソフトを作る事は普通しません。
(VC++でFrameworkのソフトを作る事は可能)

人気というか、SI系の開発では、VB.netやC#の方を主に使います。
その為全体的な開発比率ではVC++より高いはずです。
一方、ゲーム等の市販パッケージソフトはVC++を使います。
ただ最初に学習する言語としてはVB.netやC#をお勧めします。
(難易度としてVC++の方が敷居が高い為)

参考URL:http://yougo.ascii24.com/gh/84/008443.html

QX='A'とX="A"の違いは

 Cの初心者です、宜しくお願いします。

 X='A'とX="A"の意味を教えてください。

Aベストアンサー

No.2です。

No.5も回答がありますので補足程度に。
>文字コードをだす場合と、変数内の文字を打たす場合の書き方が分かりません。
「文字」「文字列」と関連して「出力書式」についても勉強が必要です。「%c」や「%d」等の「c」や「d」の部分です。

以下に一部を簡単に
c:指定されたアドレス(変数)の内容を文字として出力する
d:指定されたアドレス(変数)の内容を10進数の数値として出力する
s:指定されたアドレス(変数)を先頭として「\0(NULL文字)」が検出されるまで内容を文字として出力し続ける。
です。

従って、
>YY='A'としたときに、Aのコードを知りたいときには、print(”%c”、YY);とするのでしょうか。
こちらは問題ありませんが
>また、Aという文字を印字させたいときは、print(”%s”、YY);とするのでしょうか。
は「運が良ければ」意味不明な文字の羅列がある程度表示されるだけで終わり、運が悪ければ「保護エラー」で終了です。


人気Q&Aランキング

おすすめ情報