题目描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的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
思路
将数据记录在字符串数组中,再将数据按空格为界依次提取,记录到新的数组中,最后将数组按顺序排列,找出缺失的数字与重复的数字输出
#include<stdio.h>
#include<string.h>
int a[100];//所有数据存储
int num = 0;//数据总数
void invertNum(char c[], int n) {//转化为数字并存入
int k = 0;
for (int i = 0;i < n;i++) {
k = k * 10 + (c[i] - '0');
}
a[num] = k;
num++;
}
void compute(char c[][1000], int N) {//数据提取
int i,j;
int k = 0;
char str[20];
for (i = 0;i < N;i++) {//每一行数据
int n = strlen(c[i]);
k = 0;
for (j = 0;j < n;j++) {
if (c[i][j] == ' ' || c[i][j] == '\n') {//以到空格与回车为界
if (k > 0) {//排除无效数据
str[k] = '\0';
invertNum(str, k);//转化存入
}
k = 0;
}
else {
str[k] = c[i][j];
k++;
}
}
}
}
int main() {
int N;
char c[110][1000];
scanf("%d\n", &N);//排除回车
int i,j;
for (i = 0;i < N;i++) {
fgets(c[i], sizeof(c[i]), stdin);
}
compute(c, N);
for (i = 0;i < num;i++) {//数据排列
for (j = 0;j < i;j++) {
if (a[j] > a[i]) {
int k = a[i];
a[i] = a[j];
a[j] = k;
}
}
}
int m, n;
for (i = 1;i < num;i++) {//找出缺失与重复的数据
if (a[i] == a[i - 1] + 2)
m = a[i] - 1;
if (a[i] == a[i - 1])
n = a[i];
}
printf("%d %d\n", m, n);
return 0;
}

被折叠的 条评论
为什么被折叠?



