【发布时间】:2018-12-03 22:54:50
【问题描述】:
假设我有一个数组初始化为 0,大小为 n。
我想打印所有n 正整数的排列,加起来是一个正整数k。
我的代码目前只打印一些排列(正确的排列,但仍然缺少一些)。
例如,对于n = 4 和k = 3,我的代码正在打印:
1 1 1 0
1 1 0 1
1 0 2 0
1 0 1 1
1 0 1 1
1 0 0 2
0 2 1 0
0 2 0 1
0 1 2 0
0 1 1 1
0 1 1 1
0 1 0 2
0 1 2 0
0 1 1 1
0 0 3 0
0 0 2 1
0 0 2 1
0 0 1 2
0 1 1 1
0 1 0 2
0 0 2 1
0 0 1 2
0 0 1 2
0 0 0 3
您可以看到它缺少一些排列。例如:3 0 0 0 和 0 3 0 0 等。
代码:
#include <iostream>
void printArray(int* a, int arraySize){
for(int i = 0; i < arraySize; i++)
std::cout << a[i] << " ";
std::cout << std::endl;
}
int currentSum(int* a, int arraySize){
int sum = 0;
for(int i = 0; i < arraySize; i++)
sum += a[i];
return sum;
}
void printAll(int* a, int arraySize, int k, int beg){
for(int i = beg; i < arraySize; i++){
if(currentSum(a, arraySize) == k)
printArray(a, arraySize);
else{
a[i]++;
printAll(a, arraySize, k, beg+1);
a[i]--;
}
}
}
int main(){
int k = 3; //array must add up to k, exactly
int arraySize = 4;
int* a = new int[arraySize];
for(int i = 0; i < arraySize; i++)
a[i] = 0;
printAll(a, arraySize, k, 0);
}
【问题讨论】:
-
我建议使用调试器逐语句逐句执行代码,观察变量中的值。
-
注释掉你所有的代码,直到你有一个打印所有排列的程序。让这个工作。然后您可以将数字与
int numerical_value = text_number[i] - '0';相加。 -
这些东西不叫排列。 0 不是正整数。
标签: c++ recursion sum permutation