2014-01-10 57 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())); 
相关问题