1. 程式人生 > 實用技巧 >1059.C語言競賽-PAT乙級

1059.C語言競賽-PAT乙級

C 語言競賽是浙江大學計算機學院主持的一個歡樂的競賽。既然競賽主旨是為了好玩,頒獎規則也就制定得很滑稽:

  • 0、冠軍將贏得一份“神祕大獎”(比如很巨大的一本學生研究論文集……)。
  • 1、排名為素數的學生將贏得最好的獎品 —— 小黃人玩偶!
  • 2、其他人將得到巧克力。

給定比賽的最終排名以及一系列參賽者的 ID,你要給出這些參賽者應該獲得的獎品。

輸入格式:

輸入第一行給出一個正整數 N(≤104),是參賽者人數。隨後 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?

分析:建立結構體陣列,用陣列下標做參賽者ID的散列表,結構體中no代表排名預設為0(即沒名次),is_checked為是否已經領取禮品預設為false。按照題目要求對第二組輸入的ID進行判斷,已經領取的is_checked=true,若no=0即沒有名次則判定為ID不在排名內。判斷素數函式若引數a==1則返回false,其餘只需判斷a在[2, sqrt(a)]範圍內能被整除則不為素數,否則為素數。

注意:輸出的參賽者ID應為4位數,不足位應在數字前補0,可用printf("%04d",id)實現

#include<stdio.h>

struct S
{
    int no = 0;
    bool is_checked = false;
};

bool is_prime(int a)
{
    if (a <= 1)
        return false;
    for (int i = 2; i * i <= a; i++)
    {
        if (a % i == 0)
            return false;
    }
    return true;
}

int main()
{
    int n, k, id;
    S s[10000];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &id);
        s[id].no = i + 1;
    }
    scanf("%d", &k);
    for (int i = 0; i < k; i++)
    {
        scanf("%d", &id);
        printf("%04d: ", id);
        if (s[id].no == 0)
            printf("Are you kidding?\n");
        else if (s[id].is_checked)
            printf("Checked\n");
        else if (s[id].no == 1)
            printf("Mystery Award\n");
        else if (is_prime(s[id].no))
            printf("Minion\n");
        else
            printf("Chocolate\n");
        s[id].is_checked = true;
    }
    return 0;
}