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

题目地址:试题 历届真题 错误票据【第四届】【省赛】【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<bits/stdc++.h>
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<s.length();i++)
		{
			while(s[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<<ans1<<' '<<ans2<<endl;
	return 0;
} 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZZWWWFFF_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值