2014-01-10 86 views
1

基本思想:給定一個數組,找到該數組的所有排列。然後,採取每個陣列,並把它們放在一起。例如,數組{6,5,3,4,1,2}爲您提供653412.排列工作,但我無法得到整數。對數組進行排列,然後將它們變成一個int

int main() 
{ 

int myints[] = {2,3,4,5,6,7,8,9}; 
int k; 
int dmartin=0; 
int powof10=1; 

std::cout << "The 8! possible permutations with 8 elements:\n"; 

do { 

    for(k=0; k<8; k++){ 
     std::cout << myints[k] << ' '; 
     dmartin=myints[8-k-1]*powof10+dmartin; 
     powof10=powof10*10; 
    } 
    cout << "\n" << dmartin << "\n"; 



    } while (std::next_permutation(myints,myints+8)); 

    dmartin=0; 
    return 0; 
} 

我也有一些代碼,當你只有一個數組,但在這種情況下,有成千上萬。我雖然需要在每個循環結束時重置dmartin = 0,以便它不會繼續添加到以前的答案,但是當我嘗試爲每個答案得到「0」時。不嘗試重置,我得到的答案似乎是隨機的(並且是負面的)。

+0

這是誰d.martin傢伙,順便說一下? –

回答

1

問題是你沒有重置你的循環內的兩個變量,所以他們會繼續從他們在上一次迭代期間的值,這將是錯誤的,並會很快溢出,給看似垃圾的輸出。試着把這個放在do-while循環的開頭或結尾處:

dmartin = 0; 
powof10 = 1; 

但是你真的太複雜了。從最重要的數字而不是最不重要的數字來構建數字會更簡單。這將消除對變量powof10的需求。這個新的for循環應該是這樣的:

for(k = 0; k < 8; k++){ 
    std::cout << myints[k] << ' '; 
    dmartin = 10*dmartin + myints[k]; 
} 
0

這不會長久的工作,因爲你的整數很快就會裝滿。

這可能是您遇到負數時遇到的情況。

使用整數來存儲結果似乎不是我最合適的選擇。爲什麼不使用字符串,例如?這將爲您節省2014年重新實現base10轉換的麻煩,並且您可以在需要時從字符串中輕鬆派生出一個數字。

雖然這並不能解決溢出問題。

0

第一點:將數字向量轉換爲單個數字的代碼應該幾乎可以肯定寫成函數,而不僅僅是循環內的代碼。

觀點二:你可以使用std::stringchar的容器,並申請正常的算法吧。

在我看來,偷懶的方法是這樣的:

std::string input="23456789"; 

do { 
    std::cout<<std::stoi(input)<<"\n"; 
} while (std::next_permutation(input.begin(), input.end())); 
相關問題