1041 考試座位號(15)(15 分)
每個PAT考生在參加考試時都會被分配兩個座位號,一個是試機座位,一個是考試座位。正常情況下,考生在入場時先得到試機座位號碼,入座進入試機狀態后,系統會顯示該考生的考試座位號碼,考試時考生需要換到考試座位就座。但有些考生遲到了,試機已經結束,他們只能拿着領到的試機座位號碼求助於你,從后台查出他們的考試座位號碼。
輸入格式:
輸入第一行給出一個正整數N(<=1000),隨后N行,每行給出一個考生的信息:“准考證號 試機座位號 考試座位號”。其中准考證號由14位數字組成,座位從1到N編號。輸入保證每個人的准考證號都不同,並且任何時候都不會把兩個人分配到同一個座位上。
考生信息之后,給出一個正整數M(<=N),隨后一行中給出M個待查詢的試機座位號碼,以空格分隔。
輸出格式:
對應每個需要查詢的試機座位號碼,在一行中輸出對應考生的准考證號和考試座位號碼,中間用1個空格分隔。
輸入樣例:
4
10120150912233 2 4
10120150912119 4 1
10120150912126 1 3
10120150912002 3 2
2
3 4
輸出樣例:
10120150912002 2
10120150912119 1
思考
應該准備一個結構體來保存這個信息,結構體里有一個數組或者字符串,再來兩個數。
這讓我想起了B1016,我使用了字符串,結果使問題復雜化了。
結果14位數字直接用 long long 變量就行了,使用stdint.h會出現很多問題,因為里面是用宏定義的,在使用scanf和printf時會報錯,所以這個位數一定要確保。確保的辦法是??
晴神寶典,真的好,誰用誰知道。
這些坑,新手都可以直接避開了,適合跨考的,時間緊,任務重的。
變量聲明
2147483647
10的9次方以內,int;10的18次方以內,long long
在賦初值是,太大的要加上LL,這個我確實不知道。
關於c語言里的常量問題,晴神建議使用const這一c++的寫法,但是我需要純正的c語言,最好是ansi c的標准來編程,於是就常常使用宏定義替換了。A1042里面遇到了這個問題。
其實int 32位是long int的簡寫,long long 是long long int 的簡寫,所以long long 都是64位,而int未必是32位
當int是16位時,使用long來表示32位
1.c語言整數類型的大小並沒有精確的定義,而是隨着編譯器的類型而變化,ANSI C能保證的只是數據的最小尺寸。char>=8位,short>=16位,int>=16位,long>=32位。
2.因此,可以用typedef定義int16和int32,然后根據實際的機器環境把它們定義為int,short,long等類型。但是,標准頭文件<inttypes.h>已經定義了標准名稱int16_t,uint32_t等。
AC代碼
#include<stdio.h>
#define maxn 1010
struct student{
long long id;//准考證號
int examSeat;//考試座位號
}testSeat[maxn];//試機座位號作為下標來記錄考生
int main(){
int N;
int n,m,seat,examSeat;
long long id;
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%lld %d %d",&id,&seat,&examSeat);//准考證號、試機座位號、考試座位號
testSeat[seat].id=id;//這里不能簡化為一條語句,因為seat值未知
testSeat[seat].examSeat =examSeat;
}
scanf("%d",&m);//查詢個數
for(int i=0;i<m;i++){
scanf("%d",&seat);
printf("%lld %d\n",testSeat[seat].id, testSeat[seat].examSeat );
}
return 0;
}