蓝桥杯 基础练习(五)查找整数 C语言

查找整数 C语言

问题描述

给出一个包含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

如果以上内容有误或有缺失,欢迎读者指正~~

之前本文对全局和局部变量解释不清楚,存在一些误导,现已更正~~

你可能感兴趣的:(蓝桥杯 基础练习(五)查找整数 C语言)