C程诚意求解
不知道为什么运行出错,诚意求解Description
n 个人站成一排, 并依次编号1~n,。从编号为1 的人开始,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(设3<=n<=50)
Input
开始时的人数n
Output
第1 行是选出顺序,第2 行是两名幸运儿的开始位置(按升序排列),位置编号之间用一个空格分开。
Sample Input
12
20
45
Sample Output
2 4 6 8 10 12 3 7 11 5
1 9
2 4 6 8 10 12 14 16 18 20 3 7 11 15 19 5 13 9
1 17
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 3 7 11 15 19 23 27 31 35 39 43 5 13 21 29 37 45 9 25 41 17
1 33
下面是我编译的一个程序,但是运行出错,求问
#include<stdio.h>
#include<stdlib.h>
void search(int*k);
int main(void)
{
int team[50];
int i=0,n;
scanf("%d",&n);
for(;i<n;i++)
team[i]=i+1;
while(team[2]!=0)
search(team);//剔除一排中不符的人
printf("\n%d %d",team[0],team[1]);
return 0;
}
void search(int*k)
{
k=(int*)malloc(50*sizeof(int));
int m=0;
int n=1;
int i,j;
for(;k[m]!=0;m++);//找到数组内第m个为0,说明一排内有m个人
while(n<m)//选出人的编号
{
printf("%d ",k[n]);
n+=2;
}
n=1;
while(n<m)//将选出位置重置为0
{
k[n]=0;
n+=2;
}
for(i=1,j=2;k[j]!=0;)//形成新的一排
{
k[i]=k[j];
k[j]=0;
i++;
j+=2;
}
free(k);
}