匿名用户
1级
2019-10-31 回答
按照你的题目要求,输入一行数字空格分割,回车确认。找出1~最大输入数字间没有出现的数字。
由于输入个数不确认,所以需要动态数组。
下面我的代码,输入任意个数字,输出没有出现的数字。(如果输入了非数字字符,会被程序过滤掉)。代码已详细备注。
#include
#include
typedef struct nList
{
int *nums;//输入的数组
int len;//数组的长度
int maxN;//数组中的最大数
}NLIST;
NLIST *input();//动态数组输入任意个数的数字,空格分割,回车确认,忽略非数字字符。成功返回包含数组的结构,失败返回NULL
int main()
{
int i,j,flag;
NLIST *nlist=NULL;
nlist=input();
if(!nlist)
printf("异常!,程序终止!\n");
for(i=1;imaxN;i++)
{
flag=1;
for(j=0;jlen;j++)
if(i==nlist->nums[j])
{
flag=0;
break;
}
if(flag)
printf("%d ",i);
}
printf("\n");
free(nlist->nums);
free(nlist);
return 0;
}
NLIST *input()
{
char c;
int num=0,maxN=0,len=1,*nums=NULL,*nSave=NULL,flag=0;
NLIST *nlist=NULL;
while(1)
{
c=getchar();
if(flag &&(c==' ' || c==10))//有输入的情况下遇到空格或回车,保存数字到数组,记录长度和最大值,并重置标识和累加变量
{
if(nums==NULL)
{
nums=(int *)malloc(sizeof(int));
if(!nums)
return NULL;
nums[0]=num;
maxN=num;
len++;
}
else
{
nSave=(int *)realloc(nums,sizeof(int)*len);
if(!nSave)
return NULL;
nums=nSave;
nums[len-1]=num;
if(maxN
maxN=num;
len++;
}
num=0;
flag=0;
}
if(c==10)//遇到回车,结束输入
break;
if(c>='0' && c<='9')//遇到数字字符,标识输入状态并累加数值
flag=1,num=num*10+c-'0';
}
if(len==1)
return NULL;
nlist=(NLIST *)malloc(sizeof(NLIST));
if(!nlist)
return NULL;
nlist->len=len-1;
nlist->maxN=maxN;
nlist->nums=nums;
return nlist;
}