Добавление с массивами в C

69
6

Я пытаюсь взять 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;
}

}

спросил(а) 2013-01-16T09:15:00+04:00 7 лет, 1 месяц назад
5
Решение
51

#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-16T09:30:00+04:00 7 лет, 1 месяц назад
Еще 4 ответа
69

Вы не так далеко. Несколько сбоев

    инициализация массива с {} not() вам нужны все комбинации, поэтому требуются 3 вложенных цикла: один для красного (i), один для синего (j) и один для зеленого (k). Как вы можете видеть, для каждого красного [i] вы выполняете все синие [j], и для каждого из них вы делаете все зеленые [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-16T09:29:00+04:00 7 лет, 1 месяц назад
59

Примечания. Ваши объявления массива были неправильными, области вашего цикла были неправильными, и организация цикла могла позволить существенное проскальзывание путем тестирования на меньшее, чем условие, и устранения целых суб-циклов. Нет необходимости проходить через все сопоставления greens-to-blues для красного значения, которое уже известно не меньше текущего зеленого.

Алгоритм:

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-16T09:30:00+04:00 7 лет, 1 месяц назад
50

Из вашего краткого ответа на вопрос, я думаю, это может помочь вам, прокомментируйте, если это не то, что вам действительно нужно.

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-16T09:38:00+04:00 7 лет, 1 месяц назад
49

Или мы могли бы избегать добавления каждый раз, проверяя зеленый цикл для определенного значения.

#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-16T09:36:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема