数字排列的数字

时间:2012-01-28 23:45:33

标签: c++ performance algorithm permutation

考虑名为194的类型 int 是否可以有效地获得其他整数的数字排列?
编号:194
419 int
491 int
914 int
941 int

我正在使用next_permutation但它只适用于数组。所以我认为将int转换为int数组(?!)然后获取排列作为数组并将其转换为它是不明智的。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

置换数字基本上是字符串操作,而不是(简单)数学运算。转换为数组(字符串),然后使用next_permutation()听起来比尝试以数学方式更合理。

这是数学版本 - 没有保存中间值:

int a = 194;
int b = (a / 100)       * 100 + (a % 10)        * 10 + ((a / 10) % 10) * 1; // 149
int c = (a % 10)        * 100 + ((a / 10) % 10) * 10 + (a / 100)       * 1; // 491
int d = (a % 10)        * 100 + (a / 100)       * 10 + ((a / 10) % 10) * 1; // 419
int e = ((a / 10) % 10) * 100 + (a / 100)       * 10 + (a % 10)        * 1; // 914
int f = ((a / 10) % 10) * 100 + (a % 10)        * 10 + (a / 100)       * 1; // 941

使用中间值,可以更容易地看到正在发生的事情(除了我这次为b通过f生成了不同的分配。)

int a = 194;
int d1 = a / 100;
int d2 = (a / 10) % 10;
int d3 = a % 10;

int a = d1 * 100 + d2 * 10 + d3 * 1; // 194
int b = d1 * 100 + d3 * 10 + d2 * 1; // 149
int c = d2 * 100 + d1 * 10 + d3 * 1; // 914
int d = d2 * 100 + d3 * 10 + d1 * 1; // 941
int e = d3 * 100 + d1 * 10 + d2 * 1; // 419
int f = d3 * 100 + d2 * 10 + d1 * 1; // 491

使用next_permutation()机制;它将推广到4位数,5位数和N位数字,但不会这样。

答案 1 :(得分:0)

获取十进制数字的排列将要求您将数字作为小数进行交互,因此2次幂操作可能在这里没有多大帮助。

我的建议是:

1. Convert number to string
2. Set up the string as a circular buffer
3. Step through the buffer progressively (each increment of the index into the circular buffer will give you one permutation)
4. Reconstruct the number from the "new" arrangement of the characters representing the digits
5. Repeat for the length of the string.

除非你在一个缓慢/资源有限的环境中运行,否则我不会试图超越这个问题。

编辑:

正如评论中所指出的,这不会产生所有排列,这样做需要在重复过程的最后添加另一个步骤,但逐渐增大到索引变量的增量。

答案 2 :(得分:0)

首先必须先提取每个小数位的值:将其转换为字符数组(itoa()),或者写一个小的for循环,将数字除以10的幂。一旦你有了数字分开后,你可以编写一个循环来生成排列。