对数组进行排列,然后将它们转换为单个int

时间:2014-01-10 16:48:21

标签: c++ arrays algorithm permutation

基本思路:给定一个数组,找到该数组的所有排列。然后,取出每个阵列并将它们放在一起。例如,数组{6,5,3,4,1,2}给你653412.排列有效,但我无法得到整数。

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;
}

我还有一些代码可以在你只有一个数组时工作,但在这种情况下有数千个。我虽然我需要在每个while循环结束时重置dmartin = 0,以便它不会继续添加到上一个答案,但是当我尝试时我的每个答案都得到“0”。在没有尝试重置的情况下,我得到的答案似乎是随机的(并且是否定的)。

3 个答案:

答案 0 :(得分:1)

问题是你没有在你的循环中重置你的两个变量,所以它们将从前一次迭代中的值继续,这将是错误的,并且会很快溢出,从而产生看似垃圾的输出。尝试将其放在do-while循环的开头或结尾:

dmartin = 0;
powof10 = 1;

但是你真的过于复杂了。从最重要的数字而不是最不重要的数字构建数字会更简单。这将消除对powof10变量的需求。这个新的for循环看起来像这样:

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

答案 1 :(得分:0)

这将无法长时间工作,因为你的整数很快就会溢出。

当你得到负数时,这可能就是你所经历的。

使用整数来存储结果对我来说似乎不是最合适的选择。例如,为什么不使用字符串?这样可以省去2014年重新制作base10转换的麻烦,并且您可以在需要时轻松地从字符串中获取数字。

但这并不能解决溢出问题。

答案 2 :(得分:0)

第一点:采用数字向量并将它们转换为单个数字的代码几乎可以肯定地写成函数,而不仅仅是循环内的代码。

第二点:您可以像std::string的容器一样使用char,并对其应用常规算法。

对我来说,懒惰的方式看起来像这样:

std::string input="23456789";

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