某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。假设断号不可能发生在最大和最小号。
程序首先输入一个整数N(N<100)表示后面数据行数。接着读入N行数据。每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)每个整数代表一个ID号。
例如:
用户输入:
2
5 6 8 11 9
10 12 9
则程序输出:
7 9
/*题目解析:
用gets每行每行的读入数据,并且把中间的数据分离出来,弄一个数组,如果那个数字出现了,对应的位置+1,
因为题目说了,数都是连续的,而且不可能是最两边的数字,所以从第一个不为零的开始找,
对应的位置为0就是断掉的,对应位置为2的就是重复的
*/
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
int num[100010];
int main()
{
int n;
while(scanf("%d", &n)!=EOF){
getchar();
memset(num, 0, sizeof(num));
char str[100010];
while(n--){
gets(str);
int len = strlen(str);
long long a = 0;
for(int i = 0; i < len; i++){
if(isdigit(str[i])){ //包含在头文件#include<cctype>
a = a*10+str[i]-'0';
}
else if(str[i] == ' '){
num[a]++; // 技巧是用元素的大小当做数组的下标,这样某个下标出现的次数就是这个数出现的次数
a = 0;
}
}
num[a]++;
}
int i;
for(i = 1; num[i]==0; i++);//找到出现的最小值的方法,技巧
long long b = 0, c = 0;
for(; i < 100010; i++){
if(num[i] == 0){
b = i;
}
if(num[i] == 2){
c = i;
}
if(b && c){
printf("%d %d\n", b, c);
break;
}
}
}
return 0;
}