某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)
每个整数代表一个ID号。
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
例如:
用户输入:
2
5 6 8 11 9
10 12 9
则程序输出:
7 9
这题是来源于一位博主https://blog.csdn.net/weixin_38391092/article/details/79683430
但是他的方法我没怎么看懂(他用的C++,我还差点火候),自己有一些思路,这里贴出来,有什么问题还请指正;
首先获取数据,然后将数据进行排序,再进行判断,断号和重号有两种情况,
第一种:第一部分和第二部分完全分开,例如:1 2 3 7 8 9,这种情况只要判断array[i]+1!=array[i+1]即可找出,断号为array[i],重号为array[i+1].
第二种:第一部分和第二部分重叠,例如:1 2 3 3 4 4 5 5 6 7 8,这种情况需要判断array[i]==array[i+1],即可找到,重号为array[i],断号再用另一个循环(步长为2)找出,以i为起点,当array[i]!=array[i+1]时,即可找到,断号为array[i].
判断和容易写,但是获取数据有些困难;一种方法为用获取行数l后,用for循环,通过getchar提取字符,再将字符装换为数字,另一种方法我从另一个博主那学来的:https://www.cnblogs.com/wd1001/p/4826855.html
他那里有详细介绍,我就不再赘述了,稍微改一下就能用;
下面是我的C代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<ctype.h>
int main(int argc, char *argv[]) {
int array[100];
int i, j, l, n, flag;
int duan=-1, chong=-1;
char c;
scanf("%d",&l);//获取数据
for(i=0;i<l;i++)
{
while((c=getchar())!='\n')
{
if(isdigit(c))
{
ungetc(c,stdin);//将c送回输入流
scanf("%d",&array[n++]);
}
}
}
int cmp(void *a,void *b)//对数据进行排序
{
return (*(int*)a)-(*(int*)b);
}
qsort(array,n,sizeof(int),cmp);
flag = 0;
for(i=0;i<n;i++)
{
if(flag)
{
break;
}
if(array[i]==array[i+1]) //第二种情况
{
chong = array[i];
for(j=i;j<n;j=j+2)
{
if(array[j]!=array[j+1])
{
duan = array[j-1];
flag = 1;
break;
}
}
}
else if(array[i]+1 != array[i+1])//第一种情况
{
duan = array[i];
chong = array[i+1];
flag = 1;
break;
}
}
printf("%d %d\n",duan,chong);
return 0;
}