P8598 [蓝桥杯 2013 省 AB] 错误票据

题目背景

某涉密单位下发了某种票据,并要在年终全部收回。

题目描述

每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。

你的任务是通过编程,找出断号的 ID 和重号的 ID。

数据保证断号不可能发生在最大和最小号。

输入格式

一个整数 N(N<100)N(N<100) 表示后面数据行数,接着读入 NN 行数据,每行数据长度不等,是用空格分开的若干个(不大于 100100 个)正整数(不大于 10^5105),每个整数代表一个 ID 号。

思路

利用字符串进行输入,再转换成int,然后由小到大排序,相邻比较得到断号和重号。

 1 #include<stdio.h>
 2 #include <string.h>
 3 int main()
 4 {  
 5  char b[10005]={"0"};
 6  int a[10005]={0};
 7  int line,i,j=0,t;
 8  int num1=0,num2=0;
 9  int x=0,f=0,k=0;
10  scanf("%d\n",&line);
11     while(line--){
12         gets(b);
13         int l= strlen(b);
14         for(i=0;i<l;i++){
15             if(b[i]>='0'&&b[i]<='9'){ 
16                 x=x*10+(b[i]-'0');
17                 f=1;
18             }
19             if(b[i]==' '&&f==1){    //判断空格前是否为数字
20                 a[k]=x;22                 f=0;
23                 x=0;
24                 k++;
25             }
26         }
27         if(f){                   //读到最后一个
28             a[k]=x;30             f=0;
31             x=0;
32             k++;
33         }
34         }
35  for(i=0;i<k-1;i++)
36   for(j=i+1;j<k;j++)
37    if(a[i]>a[j])
38    {
39      t=a[i];
40      a[i]=a[j];
41      a[j]=t;
42    }                                 //由小到大排序
43  for(j=1;j<k-1;j++)                 //判断断号和重号
44  {
45   if(a[j+1]-a[j]==2)   
46   {
47      num1=a[j]+1;
48   }
49   if(a[j+1]==a[j])     
50   {
51      num2=a[j];
52   }
53  }
54  printf("%d %d",num1,num2);
55  return 0;
56 }

 

posted @ 2023-01-08 14:14  清风南鸢、  阅读(192)  评论(0)    收藏  举报