刚开始总有两个测试点过不去,错误类型:段错误
段错误造成的原因一般有:
解引用空指针
访问不可访问的内存空间(如内核空间)
访问不存在的内存地址
试图写一个只读内存空间(如代码段)
栈溢出(函数递归调用)
使用未初始化的指针(定义时没有初始化或者已经回收)
加一个if判断便解决了该问题。
如果在验证x的过程中超出了100,对b[x]强行赋值便会导致段错误
详见代码
#include<stdio.h>
int main()
{
int a[101]={0},b[101]={0},n,i,x;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
a[x]=1; //同时赋给两个数组
b[x]=1;
}
for(i=0;i<101;i++)
{
if(a[i]==1)
{
x=i;
while(x!=1)
{
x=(x%2==0)?x/2:(x*3+1)/2;
if(x>=1&&x<=100)b[x]=0; //需要判断验证过程中的x有没有超过100,若无if语句会导致段错误
}
}
}
int number=0;
for(i=100;i>=0;i--)
{
if(b[i]==1)number++; //统计关键数的数量
}
for(i=100;i>=0;i--)
{
if(b[i]==1)
{
printf("%d",i);
number--;
if(number!=0)printf(" "); //若输出的是最后一个,就不输出空格了
}
}
return 0;
}
参考:“什么是段错误”https://blog.csdn.net/bat67/article/details/52044248