问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
输入格式
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000。
这道题与上一道差不多,甚至可以对我上一篇博客中的部分代码稍加修改直接拿来用,代码如下:
#include <stdio.h>
int main() {
int n,i=0,num,p=-1;
int flag=1; //标志位
int a[1000];
scanf("%d",&n);
if(n>0&&n<=1000)
{
while(flag) //当标志位为1时,执行
{
scanf("%d",&a[i]);
if(a[i]>0&&a[i]<=10000)
{
i++;
if(i==n)
{
flag=0; //当数的数量足够时,将标志位置0,跳出循环
}
}
}
}
scanf("%d",&num); //输入待查整数
for(i=0;i<n;i++)
{
if(num==a[i])
{
p=i+1; //数组的0位有被使用,所以依据题意,应该在数组的真实位置上加1
break;
}
}
printf("%d",p);
return 0;
}
以上是正确代码,为了读者不混淆,之前版本的代码就不贴了。
这道题有一个个需要注意的地方(其他一些点在注释中有写们这里不赘述):
之前数列特征一题中数组a[n]于 if 中创建,但是这道题不行!
笔者一开始依然是在if中申请,但是编译无法通过,于是我只好退而求其次,直接在主函数开始时,就申请了一个长度为1000的数组,这才解决了问题。
事实上:
在 if 中申请数组或其他变量并不是全局变量,而是局部变量,即在 if 运行结束后,系统会自动清除在 if 中申请的这些局部变量
所以在后面的函数中就无法调用这些变量。
这里的 if 只是针对笔者的这段代码,那什么是全局变量,什么是局部变量呢?
全局变量是指在所有函数(包括main()函数!)之前申请的变量(具体例子可以上网百度找找) 而例如if、while、for等,甚至是main中申请的所有变量都是局部变量。
另外就是强调了很多遍的数据规模啦,这里就不说了。
最后,附上上一题–数列特征的地址:
蓝桥杯 基础练习(四)数列特征 C语言
有兴趣的小伙伴可以比较一下~~
----------------------------这是一条委屈的分割线------------------------
笔者回来了,笔者脸好痛…
以上的代码被评测系统残忍的驳回了(运行超时),于是乎,笔者对代码进行了一些删减,代码如下:
#include <stdio.h>
int main() {
int n,i=0,num,p=-1;
int a[1000];
scanf("%d",&n);
if(n>0&&n<=1000)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
scanf("%d",&num);
for(i=0;i<n;i++)
{
if(num==a[i])
{
p=i+1;
break;
}
}
printf("%d",p);
return 0;
}
然后终于得到了评测系统的认可…
对比一下就会发现,笔者删掉的是对 a[i] 的取值范围判断,所以笔者得出一个结论:
蓝桥杯的题目中,取值范围是针对数据类型设立的,就是说对代码在这方面并没有过分苛刻的要求。
所以上面这段正确代码其实还可以进一步简略
当然,或许有在满足笔者强迫症的前提下还能避免运行超时的问题,但是笔者暂时想不出来T—T
如果以上内容有误或有缺失,欢迎读者指正~~
之前本文对全局和局部变量解释不清楚,存在一些误导,现已更正~~