0

私は 3 つの配列を取り、要素の各組み合わせを追加して、91 に等しいかどうかを確認し、結果の赤の値が青の値よりも小さく、緑の値よりも小さいことを確認しようとしています。私は一生、非常に多くのインスタンスを保存し、最後にそれらを参照する方法を考えることはできません.

ご覧のとおり、続行方法がわからないため、コードがありません。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main(void) {

int i = 0;
int j = 0;
int k = 0;
int redSize = 6;
int blueSize = 9;
int greenSize = 9;
int red[] = (9, 22, 21, 18, 34, 13);
int blue[] = (20, 60, 14, 17, 39, 16, 6, 33, 18);
int green[] = (40, 7, 51, 26, 8, 24, 12, 11, 27);
for(i; i < redSize; i++){

    result = red[i] + blue[j] + green[k] 

    while (j < blueSize){

        // need to iterate over each item in array "blue"

        while(k < greenSize){
          //same for green

        } 

    }

    if (result == 91 && red[i] < blue[i] && blue[i] < green[i]){
    printf("The red value is %d, the blue value is %d, and the green value is %d", red[i], blue[i], green[i]);  


    }   

return 0;
}   

}
4

5 に答える 5

3

あなたはそこまでではありませんでした。いくつかの不具合

  • 配列の初期化は、() ではなく {} で行われます
  • すべての組み合わせが必要なため、3 つのネストされたループが必要です。1 つは赤 (i)、1 つは青 (j)、もう 1 つは緑 (k) です。ご覧のとおり、それぞれの red[i] に対してすべて blue[j] を実行し、それぞれに対してすべて green[k] を実行します。i*j*k要素を計算します。
  • テストは、赤、青、緑がわかっている場合 (つまり、i、j、k に値がある場合) に、ネストされたループの非常に内側の中心で実行されます。

例:(何も最適化せずにプログラムを修正しました)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main(void){


int i = 0;
int j = 0;
int k = 0;
int redSize = 6;
int blueSize = 9;
int greenSize = 9;
int red[] = {9, 22, 21, 18, 34, 13};
int blue[] = {20, 60, 14, 17, 39, 16, 6, 33, 18};
int green[] = {40, 7, 51, 26, 8, 24, 12, 11, 27};

for(i=0 ; i < redSize; i++){
  for(j=0 ; j < blueSize; j++){
    for(k=0 ; k < greenSize; k++){

      int result = red[i] + blue[j] + green[k];
      if (result == 91 && red[i] < blue[j] && blue[j] < green[k]){
        printf("The red value is %d, the blue value is %d, and the green value is %d\n", red[i], blue[j], green[k]);  
      }   

    }
  }
}

return 0;
}   
于 2013-01-16T06:29:39.993 に答える
2

注: 配列の宣言が間違っていました。ループのスコープが正しくありませんでした。また、ループの編成により、より小さい条件をテストしてサブループ全体を削除することで、実質的なスキップが可能になる可能性がありました。現在の緑よりも小さくないことが既にわかっている赤の値について、すべての緑と青の比較を実行する必要はありません。

アルゴリズム:

for each red value
   for each blue value "greater" then the current red value
      for each green value "greater" than the current blue value
           if (red+blue+green)=91, the trio is a candidate.

クラフトを大量に捨てると、次のようになります。

#include<stdio.h>

int main(void)
{
    int red[] = {9, 22, 21, 18, 34, 13};
    int blue[] = {20, 60, 14, 17, 39, 16, 6, 33, 18};
    int green[] = {40, 7, 51, 26, 8, 24, 12, 11, 27};
    int i,j,k;

    for(i=0;i<sizeof(red)/sizeof(red[0]); ++i)
    {
        for (j=0;j<sizeof(blue)/sizeof(blue[0]);++j)
        {
            if (red[i] < blue[j])
                for (k=0;k<sizeof(green)/sizeof(green[0]);++k)
                {
                    if (blue[j] < green[k] && red[i]+blue[j]+green[k]==91)
                        printf("red:%d blue:%d green:%d\n", red[i], blue[j], green[k]);
                }
        }
    }

    return 0;
}

出力

red:18 blue:33 green:40
于 2013-01-16T06:30:20.913 に答える
1
#include <stdio.h>

int main(void) {

    int red[] = {9, 22, 21, 18, 34, 13};
    int blue[] = {20, 60, 14, 17, 39, 16, 6, 33, 18};
    int green[] = {40, 7, 51, 26, 8, 24, 12, 11, 27};

    int r, g, b;

    for (r = 0; r < (sizeof(red) / sizeof(int)); ++r) {
        for (g = 0; g < (sizeof(green) / sizeof(int)); ++g) {
            for (b = 0; b < (sizeof(green) / sizeof(int)); ++b) {
                int s = red[r] + green[g] + blue[b];
                if (s == 91 && red[r] < blue[b] && blue[r] < green[g]) {
                    printf("%d %d %d", red[r], blue[b], green[g]);
                }
            }
        }
    }

    return 0;
}
于 2013-01-16T06:30:02.410 に答える
1

または、特定の値の緑のループをチェックインすることで、毎回加算を回避することもできます。

#include<stdio.h>

int main(void)
{
    int red[] = {9, 22, 21, 18, 34, 13};
    int blue[] = {20, 60, 14, 17, 39, 16, 6, 33, 18};
    int green[] = {40, 7, 51, 26, 8, 24, 12, 11, 27};
    int i = 0, j = 0, k = 0;
while(i < redSize){
      while (j < blueSize){
             kValue = 91 - red[i] - blue[j];
             while(k < greenSize){
                  if(green[k] == kValue && red[i] < blue[j] && blue[j] < green[k])
                  {
                      printf("The red value is %d, the blue value is %d, and the green value is %d", red[i], blue[j], green[k]); 
                  }
                  k++;
                }
                j++;
            }
            i++;
        }
        return 0;
}
于 2013-01-16T06:36:23.797 に答える
1

質問の概要から、これが役立つと思います。本当に必要なものではない場合はコメントしてください。

for(i=0 to redSize){
 for(j=0 to blueSize){
  for(k=0 to greenSize){
   if(red[i]<blue[j]<green[k]){
    if(91 == red[i]+blue[j]+green[k]){
       printf(red[i],blue[j],green[k]);
    }
   }
  }
 }
}
于 2013-01-16T06:38:02.320 に答える