题目描述:
1 错误票据
问题描述
某涉密单位下发了某种票据,并要在年终全部收回。 每张票据有唯一的 ID 号。
全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。
因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。
你的任务是通过编程,找出断号的 ID 和重号的 ID。
假设断号不可能发生在最大和最小号。
输入格式
要求程序首先输入一个整数 N(N<100)表示后面数据行数。 接着读入 N 行数据。
每行数据长度不等,是用空格分开的若干个(不大于 100 个)正整数(不大于 100000),
请 注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。 每个整数代表一个 ID 号。
输出格式
要求程序输出 1 行,含两个整数 m n,用空格分隔。 其中,m 表示断号 ID,n 表示重号 ID
样例输入 1
25 6 8 11 9 10 12 9
样例输出 1
7 9
样例输入 2
6164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119
样例输出 2
105 120
思路:
刚开始的思路就是:简单的数组中的数据比较,后面发现这样太简单了,找不出断号,
遍历寻找才能找到断号的,断号就是没出现过一次[m]=0.重号就是出现了两次a[n]=2.
新知识:
ungetc(ch, stdin);将你读到的字符回退到输入流中
比如上面的程序你先输入数字25,scanf读到i中,加到sum中,然后你再输入,调用ch=getchar(),
发现ch不是‘ ‘也不是‘\n‘,而是一个数,比如’7‘,显然这是你要继续加到sum中的数,要用scanf读到i中,
但是你已经将这个‘7‘用getchar读出来了,只好用ungetc再把这个‘7‘给退回去
C++:
1 #include<iostream> 2 using namespace std; 3 4 int main(){ 5 int m; 6 int n; 7 int N; 8 cin>>N; //行数 9 char a[100001]={0}; //输入N行数据 //建立标号出现的次数,并初始化为0 10 //(表示这些数都没出现过) 11 int min=100001; //为了让第一个与它比较的数取代它成为最小值 12 int max=0; //同理 13 int biaohao; 14 char c; 15 getchar(); 16 17 for(int i=0;i<N;){ //输入数据 18 c=getchar(); 19 if(c>=‘0‘&&c<=‘9‘){ 20 ungetc(c,stdin); 21 cin>>biaohao; 22 a[biaohao]++; //改变对应标号出现的次数 23 if(biaohao<min)min=biaohao; 24 if(biaohao>max)max=biaohao; 25 } 26 else if(c == ‘\n‘){ //遇到回车 27 i++; 28 } 29 for(int i=min;i<max;i++){ 30 if(a[i]==0){ //断号 31 m = i; 32 } 33 if(a[i]==2){ //重号 34 n = i; 35 } 36 } 37 } 38 cout<<m<<" "<<n; //必须在这个位置,否则无法输入第二行 39 return 0; 40 }