第四届蓝桥杯省赛真题 错误票据

第四届蓝桥杯省赛真题 错误票据_第1张图片

第四届蓝桥杯省赛真题 错误票据_第2张图片

题目地址:试题 历届真题 错误票据【第四届】【省赛】【B组】 

题目翻译:给你一堆连续的数字,但是由于某些原因,造成了一处错误,导致有一个数字与另一个数字相同、有一个数字消失了,导致数字不连续了

该题思路比较简单:我们将这堆数字输入到数组里,计算每个数字出现的次数,最后遍历数组判断哪个数字出现次数为0和哪个数字出现次数为2即可

不过,该题难点主要在于数据的输入,我们需要在只知道数据的行数,不知道每行数据的列数的情况下输入

我们不难想到getchar()来判断空格或者换行符,据此来输入数据

如下

	char noth;
	int row,i=0,cn=0,num,ans1,ans2;
	int nums[100005]={0};
	cin>>row;
	while(1)
	{
		cin>>num;
		nums[i]=num;
		i++;
		noth=getchar();//吸收数字后面的字符
		if(noth=='\n')
		{
			cn++;
			if(cn==row)//换行符等于行数
			{
				break;
			}
		}
	}

可是这样真的可以吗?我就使用了该方法输入数据,结果OJ提示运行错误,我调试一番才发现,每一行最后一个元素的后面那个字符是空格而不是换行符,所以该方法不可行!!!

那我们只能采用string的输入方法直接输入一整行来处理数据的输入了

注意

string scin>>s;输入时遇到空格会停下来。如果想要直接录入一整行知道遇到换行符停下来的话就用 getline(cin,s); 来输入,gets也可以输入空格,录入一整行。但是和getline不同的是 gets遇见换行符会变为'\0'输入,而getline是直接抛弃换行符

据此,我们选择使用getline输入string,由于将每个数字变成了string里的每个字符,我们便需要多一步将字符处理成数字的操作 

综上代码转换如下:

#include
using namespace std;

string s;
int MAX=0,MIN=INT_MAX;
const int MAXN=100005;
int nums[MAXN];

int main()
{
	int n,ans1,ans2;
	cin>>n;
	getchar();//注意这里一定要加getchar
	while(n--)//输入每一行
	{
		getline(cin,s);
		s+=' ';//这里是为了连接后面的数字
		int num=0;
		for(int i=0;i='0'&&s[i]<='9')//数字字符
			{
				num=num*10+(s[i]-'0');//转换为数字
				i++;//下一个字符
			}
			if(s[i]==' ')
			{
				MAX=max(MAX,num);
				MIN=min(MIN,num);//寻找数字的最大与最小值
				nums[num]++;//数字个数++
				num=0;重新初始化
			}
		}
	}
	for(int i=MIN;i<=MAX;i++)//遍历所有数字
	{
		if(nums[i]==0)
		{
			ans1=i;
		}
		if(nums[i]==2)
		{
			ans2=i;
		}
	}
	cout<

值得注意的是在使用getline之前我们要先用getchar消去n后面的换行符,否则getline会先吸收该换行符

你可能感兴趣的:(蓝桥杯历年真题题解,c++,蓝桥杯)