您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 又是Segemantion Error ! 实现环形排列的筛选

又是Segemantion Error ! 实现环形排列的筛选

来源:网络整理     时间:2016/8/19 4:59:46     关键词:

关于网友提出的“ 又是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

相关图片

相关文章