AIと戦って、あなたの人生のリスク診断 >>

x= 2 or 1
y= 2 or 1 or 0
z= 1 or 0

このとき、x + y + z = 3となるx, y, z の組み合わせにおいての
(x * M1) - (y * M2) - (z * M3)
を全て求めたいのですが、どのようにすればいいのか教えてください。お願いします。

また、M1,M2,M3の値はランダムなを数入れるので気にしないでください。

A 回答 (4件)

>x= 2 or 1


>y= 2 or 1 or 0
>z= 1 or 0
であるなら
void main(void)
int ans,x,y,z,M1,M2,M3;
M1 = rand(); M2 = rand(); M3 = rand();
for (x = 1;x <= 2;x++) { /* 2 or 1 */
 for (y = 0;y <= 2;y++) { /* 2 or 1 or 0 */
  for (z = 0;z <= 1;z++) { /* 0 or 1 */
   if (x + y + z == 3) {
    ans = (x * M1) - (y * M2) - (z * M3);
    printf("x=%d y=%d z=%d ans=%d\n",x,y,z,ans);
   }
  }
 }
}
って感じで、総当りでx,y,zを全部ループして、x,y,z足して3の時だけ表示、でOKでしょう。
    • good
    • 0

因みに、取り得る値が「6 or 4 or 2 or 1 or 0」のように、飛び飛びの場合は「最小値から最大値までのループ」の内側に判定式を足し


for (x = 1;x <= 6;x++) { /* 0 - 6 */
 if ((x == 0) || (x == 1) || (x == 2) || (x == 4) || (x == 6)) { /* 0 or 1 or 2 or 4 or 6 */
  for (y = 0;y <= 2;y++) { /* 2 or 1 or 0 */
   for (z = 0;z <= 1;z++) { /* 0 or 1 */
のようにすればOK。

なお、除外する値の方が数が少ない(上記例なら3と5を除外)場合は
for (x = 1;x <= 6;x++) { /* 0 - 6 */
 if ((x == 3) || (x == 5)) continue; /* 0 or 1 or 2 or 4 or 6 */
 for (y = 0;y <= 2;y++) { /* 2 or 1 or 0 */
  for (z = 0;z <= 1;z++) { /* 0 or 1 */
でもOK。
    • good
    • 0
この回答へのお礼

大変参考になりました。
ありがとうございました。

お礼日時:2007/11/07 16:33

>x= 2 or 1


>y= 2 or 1 or 0
>z= 1 or 0

>このとき、・・・

最初の3行が前提条件だと思いますので^^;

x, y, zの値をそれぞれ配列の要素として持たせたものを
用意して、(↓みたいなもの)
int x_box[2] = { 2, 1 };
int y_box[3] = { 2, 1, 0 };
int z_box[2] = { 1, 0 };

x_box[0]とy_box[0]とz_box[0]を足した結果を判定(3か?)、
次に
x_box[1]とy_box[0]とz_box[0]を足した結果を判定・・・
のような感じで処理を繰り返させて、
その際、判定結果が3であれば出力する等...
の処理にすれば良いのでは?と思います。

3つあるのがわかりづらいのであれば、
まずは2つで作ってみてはどうでしょうか?
↓のような・・・

x= 2 or 1
y= 2 or 1

このとき、x + y = 3となるx, yの組み合わせにおいての(x * M1) - (y * M2)
    • good
    • 0

質問の文面だけを見る限り、x, y, zの型が実浮動小数点数や複素数の可能性もありますから、



> x + y + z = 3となるx, y, z の組み合わせ

は無数に存在します。
実際には、精度による制限があるので限られてはきますが、それでもすべて挙げるのは大変です。
~_EPSILONマクロの値を加算しつつ指数部をldexpで合成していくことも可能ですが、全ビットパターンを総当りして、isfiniteで非数と無限大を除外した方が簡単かもしれません。
# でもトラップ表現を判別する方法がない...
    • good
    • 0
この回答へのお礼

>質問の文面だけを見る限り、

x,y,zは整数でしたがだったんですが、聞き方が悪くてお手数をかけてしまいました。

回答ありがとうございました。

お礼日時:2007/11/07 16:28

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


人気Q&Aランキング