题目链接:http://lx.lanqiao.org/problem.page?gpid=T28
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
要求程序首先输入一个整数N(N<100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。
每个整数代表一个ID号。
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
题目大意:找出一连串数字中断号的和重复号的。
解题思路:注意一定要先输出断号的在输出重号的,还有结果只会输出两个数。再就是考虑一下它的输出,每一次的输入长度是不能够确定的,所以采用字符串的方法进行输出,在一个一个进行截取。但是题目中有说会出现多余的空格,这个是需要处理一下的。
详见代码。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char ch[1010][10100]; int num[101000]; int main() { int n,k; while (~scanf("%d",&n)) { k=0; getchar(); for (int i=0; i<n; i++) { gets(ch[i]); int len=0; while(ch[i][len]!='\0') len++; int a=0; while(ch[i][len-1]==' ') len--; //puts(ch[i]); //cout<<len<<endl; for (int j=0; j<len; j++) { if(ch[i][j]>='0'&&ch[i][j]<='9') { a=a*10+ch[i][j]-'0'; } if(ch[i][j]==' '&&ch[i][j-1]!=' ') { num[k++]=a; //cout<<"a="<<a<<endl; a=0; } } num[k++]=a; } sort(num,num+k); int flag=0; for (int i=1; i<k; i++) { if (num[i]>num[i-1]+1) { cout<<num[i]-1<<" "; } } for (int i=1; i<k; i++) { if (num[i]==num[i-1]) { cout<<num[i]<<endl; } } } return 0; }
原文:http://blog.csdn.net/qiqi_skystar/article/details/50930616