2011-12-25 4 views
0

Я пытаюсь выяснить, как эффективно определить все числа, которые могут быть получены как линейная комбинация некоторого набора, скажем, первые несколько обильных чисел (12,18,20,24). Проблема заключается в том, как я сейчас хочу подходить к ней, чтобы пробежать все числа a * 12 + b * 18 + c * 20 + d * 24, где сумма не превышает 100. Теперь я подумал о двух способах. Множественный вложенный цикл while или один while, который увеличивает разные вещи на основе условного в верхней части цикла while. Моя проблема с обоими методами заключается в том, что я не знаю, сколько условностей или вложенных циклов мне понадобится до выполнения, поскольку я не знаю, сколько разных чисел я собираюсь суммировать. Есть ли способ написать мою программу так, чтобы ее вложенные n раз для n числа, или, следовательно, для n номеров n номеров.Создание множества вложенных циклов

Вот контур блока переключателей:

int count=1; 
while(true){ 
    if(num2<smal){ 
     switch(count){ 
     case 1: 
      a++; 
      break; 
     case 2: 
      b++; 
      break; 
     case 3: 
      c++; 
      break; 
     case 4: 
      d++; 
      break; 
     } 
    } 
    else { 
     switch(count){ 
     case 1: 
      if(a!=0){ 
       a=0; 
       b++; 
      } 
      else{count++;} 
      break; 
     case 2: 
      if(b!=0){ 
       b=0; 
       c++; 
       count--; 
      } 
      else{count++;} 
      break; 
     case 3: 
      if(c!=0){ 
       c=0; 
       d++; 
       count--; 
      } 
      else{count++;} 
      break; 
     case 4: 
      break; 
     } 
    } 
    //num is update here 
    if(count==4){break;} 


} 

ответ

0

Я не знаю, какой язык вы используете, но если вы не знаете, сколько уровней в глубину вы, возможно, придется идти, то вы должны рассмотреть рекурсию (если ее не сотни или тысячи, вы взорвите стек).

Если вы не знакомы с рекурсией, то там, где у вас есть вызов функции. Вот глупый пример.

Result doStuff(Stuff stuff, int level) { 
    SubResult sr = null; 
    if(stuff > 0) { 
     sr = doStuff(stuff, level -1); 
    } 
    Result r = interesting_calculation(stuff, sr); 
    return r; 
} 

Рекурсия может быть сложной, но иногда ее правильным инструментом для работы.

+0

Ух ты, наверное, должен был подумать об этом. Я использую C++ btw. Думаю, мне, возможно, понадобится еще раз изучить мой подход. Поскольку я чувствую, что рекурсия может быстро вырасти из-под контроля. – emschorsch

+0

Ничего себе, я просто понял, что я неправильно понял вопрос Эйлера Эйлера, поэтому я думал, что вопрос был настолько невероятно тяжелым. Lol вопрос, как я теперь понимаю, кажется почти тривиальным. Мне нужно найти числа, которые больше не могут быть выражены как сумма двух чисел, и он не включает кратные числа, которые упрощают все. В любом случае, спасибо за вашу помощь. – emschorsch

+0

Просто интересно, можете ли вы ссылаться на вопрос? Благодаря! – Bill

Смежные вопросы