• ベストアンサー

C言語でですが

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の値はランダムなを数入れるので気にしないでください。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

>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でしょう。

その他の回答 (3)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.4

因みに、取り得る値が「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。

metal-555
質問者

お礼

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

  • akiyousan
  • ベストアンサー率29% (13/44)
回答No.2

>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)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

質問の文面だけを見る限り、x, y, zの型が実浮動小数点数や複素数の可能性もありますから、 > x + y + z = 3となるx, y, z の組み合わせ は無数に存在します。 実際には、精度による制限があるので限られてはきますが、それでもすべて挙げるのは大変です。 ~_EPSILONマクロの値を加算しつつ指数部をldexpで合成していくことも可能ですが、全ビットパターンを総当りして、isfiniteで非数と無限大を除外した方が簡単かもしれません。 # でもトラップ表現を判別する方法がない...

metal-555
質問者

お礼

>質問の文面だけを見る限り、 x,y,zは整数でしたがだったんですが、聞き方が悪くてお手数をかけてしまいました。 回答ありがとうございました。

関連するQ&A