C語言 · 錯誤票據


歷屆試題 錯誤票據  
時間限制:1.0s   內存限制:256.0MB
       
錦囊1
  排序。
錦囊2
  把所有的編號排序,再掃描一遍數組,即可找到重復的和遺漏的。
 
問題描述

某涉密單位下發了某種票據,並要在年終全部收回。

每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。

因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。

你的任務是通過編程,找出斷號的ID和重號的ID。

假設斷號不可能發生在最大和最小號。

輸入格式

要求程序首先輸入一個整數N(N<100)表示后面數據行數。

接着讀入N行數據。

每行數據長度不等,是用空格分開的若干個(不大於100個)正整數(不大於100000),請注意行內和行末可能有多余的空格,你的程序需要能處理這些空格。

每個整數代表一個ID號。

輸出格式

要求程序輸出1行,含兩個整數m n,用空格分隔。

其中,m表示斷號ID,n表示重號ID

樣例輸入1
2
5 6 8 11 9 
10 12 9
樣例輸出1
7 9
樣例輸入2
6
164 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
 
法一:
 1 /*
 2     輸入完樣例按下回車 再按Ctrl+z 再按下回車就行了
 3 */
 4 #include<stdio.h>
 5 #include<string.h>
 6 #include<stdlib.h>
 7 #define mem(A) memset(A,0,sizeof(A))
 8 #define N 10000010
 9 int piao[10010]; 
10 int main(){                       
11    int n;
12    scanf("%d",&n);
13    getchar();//處理此處的換行符 
14    int num=0;//票數量 
15    while(scanf("%d",&piao[num++]) != EOF);
16    /*冒泡升序*/
17    for(int i=0; i<num-1; i++){
18         for(int j=0; j<num-1-i; j++){
19             if(piao[j]>piao[j+1]){
20                 int t = piao[j];
21                 piao[j] = piao[j+1];
22                 piao[j+1] = t;
23             }
24         }
25     }
26     int duan=0,chong=0;
27        for(int i=0;i<num;i++){
28         if(piao[i]==piao[i-1])
29                chong=piao[i];
30            else if(piao[i]-piao[i-1]!=1)
31                duan=piao[i-1]+1;
32        }
33        printf("%d %d",duan,chong);
34        return 0;
35 } 

法二:

  1、用qsort;

  2、學會了用strtok函數:分解字符串為一組字符串。strtok(line," ");//line為要分解的字符串,空格分隔符字符 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 char line[100000*100];//每行數據的最長長度 
 5 int piao[10010];//票數量 
 6 int cmp(const void *a,const void *b){
 7     return *(int *)a - *(int *)b;
 8 }
 9 int main(){                     
10        int n;
11        scanf("%d",&n);
12        getchar();//處理此處的換行符 
13        int num=0;//票數量
14     int index;//數組下標 
15        for(int i=0; i<n; i++){
16         gets(line);//將一行數據以字符串的方式接收
17         //分解字符串為一組字符串
18         char *p = strtok(line," ");//line為要分解的字符串,空格分隔符字符 
19         //atoi將字符串轉為int類型
20         piao[index++]=atoi(p);//將數據轉為int類型賦給票據數組 
21         while(p){
22             p = strtok(NULL," ");
23             if(p){
24                 piao[index++] = atoi(p);
25             }
26         }
27         //排序 
28         qsort(piao,index,sizeof(piao[0]),cmp);
29     }
30     int duan=0,chong=0;
31        for(int i=0;i<index-1;i++){
32         if(piao[i]==piao[i-1])
33                chong=piao[i];
34            else if(piao[i]-piao[i-1]!=1)
35                duan=piao[i-1]+1;
36        }
37        printf("%d %d",duan,chong);
38        return 0;
39 } 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM