2011-12-25 115 views
0

我想弄清楚如何有效地找出所有的數字,可以作爲一些集合的線性組合,比如說前幾個豐富的數字(12,18,20,24)。問題是我現在想要接近它的方式是遍歷所有總和不超過100的數字a * 12 + b * 18 + c * 20 + d * 24。現在我想到了2種方法。一個多重嵌套的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 2011-12-25 03:49:12

+0

哇我剛剛意識到我在誤讀項目歐拉問題,這就是爲什麼我認爲這個問題非常難以置信。大聲笑的問題,因爲我現在明白,似乎幾乎微不足道。我只需要找到可以表示爲兩個數字之和的數字,而不包括那些數字的倍數,這些數字可以簡化所有的事情。無論如何,感謝您的幫助。 – emschorsch 2011-12-25 04:41:57

+0

只是好奇,你可以鏈接到這個問題?謝謝! – Bill 2011-12-26 05:01:08