蓝桥杯试题 历届试题 错误票据
这个题目我觉得比较麻烦的是,他对于每一行数据的输入,没有给出一个输入数据的数量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;
}
若有错误,或者更好的办法,麻烦指出!谢谢啦