关于网友提出的“ 又是Segemantion Error ! 实现环形排列的筛选”问题疑问,本网通过在网上对“ 又是Segemantion Error ! 实现环形排列的筛选”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 又是Segemantion Error ! 实现环形排列的筛选
描述: 此程序目的如下:
有N个人环形排列,1-3报数,报到3的退出来,求最后剩下哪个.
一下程序用gdb调试时,出现Segemantion Error .
#include
void init(int a[],int n);
/* 初始化函数 */
int func(int a[],int n);
/* 核心算法 */
int main()
{
int n,a[99];
printf("\nHow many elements do you need:");
scanf(" %d",&n);
realloc(a,n*2);
/* 分配所需的空间 */
init(a,n);
printf("Remains:%d\n",func(a,n));
free(a);
return 0;
}
void init(int a[],int n)
{
int i;
for(i=0;i<>
a[i]=i++;
}
int func(int a[],int n)
{
int i=-1,cal=0,cal2=0;
/* cal 和 cal2 是两个计数变量. */
while(cal<>
{
cal2=0;
do
/* 这个循环每执行一次,就完成一次1-3报数 */
{
i++;
if(i>=n)
i-=(n+1);
else if(a[i]==0)
/*此人已退出,所以不参加报数*/
continue;
else
cal2++;
}
while(cal2++<3&&a[i]!=0);
a[i]=0;
/*报到3的退出,退出的人用0标志*/
cal++;
}
for(i=0;i<>
{
if(a[i]!=0)
return a[i];
}
printf("All are zero!\n");
}
测试方法,若输入8,则输出7.
解决方案1: 一下为我该国的;
#include
#include
void init(int a[],int n);
/* 初始化函数 */
int func(int a[],int n);
/* 核心算法 */
int main()
{
int n,*a;
printf("\nHow many elements do you need:");
a = (int*)malloc(sizeof(int)*99);
scanf(" %d",&n);
realloc(a,sizeof(int)*n);
/* 分配所需的空间 */
init(a,n);
printf("Remains:%d\n",func(a,n));
free(a);
return 0;
}
void init(int a[],int n)
{
int i;
for(i=0;i<>
a[i]=i+1;
}
int func(int a[],int n)
{
int i=-1,cal=0,cal2=0;
/* cal 和 cal2 是两个计数变量. */
while(cal<>
{
cal2=0;
do
/* 这个循环每执行一次,就完成一次1-3报数 */
{
i++;
if(i>=n)
i-=(n+1);
else if(a[i]==0)
/*此人已退出,所以不参加报数*/
continue;
else
cal2++;
}
while(cal2<3);
a[i]=0;
/*报到3的退出,退出的人用0标志*/
cal++;
}
for(i=0;i<>
{
if(a[i]!=0)
return a[i];
}
printf("All are zero!\n");
}
数组不能被重新分配内存空间啊:)
以上介绍了“ 又是Segemantion Error ! 实现环形排列的筛选”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3384363.html