蓝桥杯试题 历届试题 错误票据

蓝桥杯试题 历届试题 错误票据

在这里插入图片描述
在这里插入图片描述
这个题目我觉得比较麻烦的是,他对于每一行数据的输入,没有给出一个输入数据的数量n,所以在实质上就是解决读取的问题,所以只能读取每一行的字符串,再将字符串转化为数字存入到数组。存了之后,进行一个排序,再依次遍历。
所以将问题就转化为将一行的字符串转化为一个个数字的问题。而我们结束转化为一个数字的标志就是空格,或者读至结尾处。所以当我们读到空格或者读完时,就完成了一个数据的转化,就将其压入数组中。
所有数据处理完毕后,将数组进行排序,则可求出结果。

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
vector<int> a;
int main()
{
	int n, i, j, num = 0, m, e;//n->行数,m->断号ID,n->重号ID
	string b;//读入的字符串
	cin >> n;
	getchar();//将输入的n后面的回车读掉
	for (i = 0 ; i < n ; i++)
	{
		getline(cin, b);//读入一行的字符串
		for (j = 0 ; j < b.length() ; j++)
		{
			if(b[j] >= '0' && b[j] <= '9')//若读到数字,则进行一个持续的转化
			{
				num = num * 10 + b[j] - '0';
			}
			if (b[j] == ' ' || j == b.length() - 1)//若读到空格,或者读至结尾处,则一个数字读完,将其压入数组
			{
				a.push_back(num);
				num = 0;//别忘记将num重置为0了哦
			}
		}
	}
	sort(a.begin(), a.end());//排序
	for (i = 1 ; i < a.size() ; i++)
	{
		if (a[i] == a[i - 1])
		{
			e = a[i];
		}
		else if (a[i] != a[i - 1] + 1)//这一步放在a[i] == a[i - 1]这个条件后面,因为该条件也满足两数字相等。并且需要用一个else if而不是if,不然容易判断出两数相等,而将数字储存错误
		{
			m = a[i - 1] + 1;
		}
	}
	cout << m << " " << e;
	return 0;
}

若有错误,或者更好的办法,麻烦指出!谢谢啦

发布了13 篇原创文章 · 获赞 5 · 访问量 493

猜你喜欢

转载自blog.csdn.net/qq_44410340/article/details/104929090