題目描述:數組
C 語言競賽是浙江大學計算機學院主持的一個歡樂的競賽。既然競賽主旨是爲了好玩,頒獎規則也就制定得很滑稽: 0、冠軍將贏得一份「神祕大獎」(好比很巨大的一本學生研究論文集……)。 一、排名爲素數的學生將贏得最好的獎品 —— 小黃人玩偶! 二、其餘人將獲得巧克力。 給定比賽的最終排名以及一系列參賽者的 ID,你要給出這些參賽者應該得到的獎品。 輸入格式: 輸入第一行給出一個正整數 N(≤10000 ),是參賽者人數。隨後 N 行給出最終排名,每行按排名順序給出一位參賽者的 ID(4 位數字組成)。接下來給出一個正整數 K 以及 K 個須要查詢的 ID。 輸出格式: 對每一個要查詢的 ID,在一行中輸出 ID: 獎品,其中獎品或者是 Mystery Award(神祕大獎)、或者是 Minion(小黃人)、或者是 Chocolate(巧克力)。若是所查 ID 根本不在排名裏,打印 Are you kidding?(耍我呢?)。若是該 ID 已經查過了(即獎品已經領過了),打印 ID: Checked(不能多吃多佔)。 輸入樣例: 6 1111 6666 8888 1234 5555 0001 6 8888 0001 1111 2222 8888 2222 輸出樣例: 8888: Minion 0001: Chocolate 1111: Mystery Award 2222: Are you kidding? 8888: Checked 2222: Are you kidding?
解答關鍵:spa
// 關鍵點:控制數字的格式化輸出 // 如將整數1按照格式 0001輸出 // 則採用下面的輸出格式控制,比較簡單,沒必要用字符串控制輸出 printf("%04d\n",val);
本人AC代碼:blog
下述代碼改進方法:字符串
// int Class[Max] = {0}; // 5表明特等獎,3表明小黃人,1表明巧克力 // 對每個數字判斷是否爲素數,冗餘量較高,則在領獎時對相應的序號判斷便可 int prime = 0; // 設置參數表示該位置是否爲素數
//1059 C語言競賽 // 關鍵點:控制數字的格式化輸出 # include <stdio.h> # include <math.h> # define Max 10001 int Prime(int ); int main(void) { int Num[Max]; int flag[Max] = {0}; // -1 表明領過獎了 int Class[Max] = {0}; // 5表明特等獎,3表明小黃人,1表明巧克力 int len1, len2, i, j, N, val; int temp = 0; // 設置參數,temp=0,表明沒有找到,temp=1,表明找到 scanf("%d",&N); len1 = N; for (i=1; i<=len1; i++) { scanf("%d",&Num[i]); if (1 == Prime(i)) Class[i] = 3; else Class[i] = 1; } Class[1] = 5; scanf("%d",&N); len2 = N; for (i=1; i<=len2; i++) { temp = 0; scanf("%d",&val); // 在Num[]數組中遍歷查找val for (j=1; j<=len1; j++) { if (Num[j] == val) { temp = 1; // 設置標誌位爲1,表示找到了 break; } } // 若是找到,則比較是否領過獎品 if(1 == temp) { // 領過獎品 if (-1 == flag[j]) { printf("%04d: Checked\n",val); } // 沒有領過 else if (0 == flag[j]) { if (5 == Class[j]) { printf("%04d: Mystery Award\n",val); } else if (3 == Class[j]) { printf("%04d: Minion\n",val); } else if (1 == Class[j]) { printf("%04d: Chocolate\n",val); } // 領過獎以後設置標誌位爲-1 flag[j] = -1; } } // 不然,輸出Are you kidding? else { printf("%04d: Are you kidding?\n",val); } } return 0; } int Prime(int n) { int i = 2; for (i; i<=sqrt(n); i++) { if (n%i == 0) return 0; } return 1; }