标签:
问题描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。
每个整数代表一个ID号。
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
#include <stdio.h> #include <stdlib.h> #include <string.h> int id[100001]; char c[7];//保存整型数 int main() { int N,i,j,a; int bnum,rnum; int flag; char t; scanf("%d",&N); for(i=0;i<N;i++) { scanf("%d",&a); id[a] += 1; while(1) { memset(c,‘\0‘,7);//每次接收一个整数之前必须要初始化 j = 0; while(scanf("%c",&c[j]) && c[j] == ‘ ‘);//处理行内可能的多个空格,接收数字或换行时则跳出循环 if(c[j] == ‘\n‘) break; scanf("%c",&c[j+1]); if(c[j+1] == ‘\n‘ || c[j+1] == ‘ ‘)//表示整数仅有一位 { a = c[j] - ‘0‘; id[a] +=1; if(c[j+1] == ‘\n‘) break; } else{ j += 2; scanf("%c",&c[j]); while(c[j] >=‘0‘ && c[j] <= ‘9‘) { j ++ ; scanf("%c",&c[j]); } t = c[j]; c[j] = ‘\0‘;//尽管memset已经将c全部初始化为‘\0‘,但是可能因为接收到空格而跳出上面的循环 a = atoi(c);//将字符串转化为整数 id[a] += 1; if(t == ‘\n‘)//需要对换行进行处理 break; } } } for(i=0;i<100001;i++) if(id[i]==1) break; flag = 0; for(j=i+1;j<100001;j++)//id数组里面可能有很多0,我们取ID号首尾之间的0,即从首ID号之后的第一个0 { if(id[j] == 0 && !flag) { bnum = j; flag ++; } else if(id[j] == 2){ rnum = j; } } printf("%d %d\n",bnum,rnum); return 0; }
测试数据都很弱啊,怎么会超时???真心不懂
标签:
原文地址:http://www.cnblogs.com/520xiuge/p/5171022.html