我正在尝试编写一个代码来创建一些给定数字的所有排列,然后将它们全部保存到一个数组中。 排列算法工作得很好,当我尝试将每个排列保存到数组中时,问题就出现了。该数组是一维的,所以我编写了以下代码:
m++;
for (int i=0;i<len;i++){
plist[m*len+i] = v[i];
}
其中m是函数被调用的次数(因为它是递归的),plist是我想要保存所有排列的数组,并且v 是单个排列数组。
当我运行此代码时,代码停止工作,没有任何错误。
这是完整的代码:
#include <stdio.h>
#include <stdlib.h>
int len;
int plist[100];
int m = -1;
void swap (int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void heappermute(int v[], int n) {
int i;
if (n == 1) {
m++;
for (int i=0;i<len;i++){
plist[m*len+i] = v[i];
}
}
else {
for (i = 0; i < n; i++) {
heappermute(v, n-1);
if (n % 2 == 1) {
swap(&v[0], &v[n-1]);
}
else {
swap(&v[i], &v[n-1]);
}
}
}
}
int main()
{
int num[11];
int i;
printf("How many numbers you want to enter: ", len);
scanf("%d", &len);
printf("\nEnter %d numbers: ");
for ( i = 0 ; i < len; i++)
scanf("%d", &num[i]);
heappermute(num, len);
for (int i=0;i<96;i++){
printf(plist[i]);
}
return 0;
}
问题是什么?
最佳答案
这是您的代码的工作版本:
#include <stdio.h>
#include <stdlib.h>
int len;
int plist[100];
int m = -1;
void swap (int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void heappermute(int v[], int n) {
int i;
if (n == 1) {
m++;
for (i=0;i<len;i++){
plist[m*len+i] = v[i];
}
}
else {
for (i = 0; i < n; i++) {
heappermute(v, n-1);
if (n % 2 == 1) {
swap(&v[0], &v[n-1]);
}
else {
swap(&v[i], &v[n-1]);
}
}
}
}
int main()
{
int num[11];
int i;
printf("How many numbers you want to enter: ");
scanf(" %d", &len);
printf("\nEnter %d numbers: ", len);
for ( i = 0 ; i < len; i++)
scanf("%d", &num[i]);
heappermute(num, len);
for (i=0;i<96;i++){
printf("%d", plist[i]);
}
return 0;
}
附注您不应将 plist 的大小声明为 100 个元素,而应动态地将其分配为所需的大小,例如对于 d 位数字,d *(d 的排列数)元素
关于C:当我将一个数组复制到另一个数组时,代码停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44096251/