​PAT 1116​​​ ​​C++​​版

1.题意

根据输入确定得奖信息;根据查询id以及相应规则,输出获奖信息。

2.分析

  • 使用​​map​​​存储获奖信息,如果已经领奖,则重置成​​Checked​

3.代码

#include<cstdio>
#include<map>
#include<string>
#include<iostream>
#include<cmath>
using namespace std;

bool isPrime(int number){
if(number == 1) return false;
if(number == 2) return true;
for(int i = 2;i <= sqrt(number); i++){
if(number % i == 0){
return false; // is not a prime
}
}
return true;//is a prime
}

int main(){
map<int,string> awardList;
int N;
scanf("%d",&N);
int i;
int id;//表示每个人的id

for(i = 1;i<= N ;i++){
scanf("%d",&id);//输入id
if(i == 1){
awardList[id] = "Mystery Award";
}
else if(isPrime(i)){
awardList[id] = "Minion";
}
else
awardList[id] = "Chocolate";
}

int queryNum ;
scanf("%d",&queryNum);
int queryId;
for(i = 0;i< queryNum;i++){
scanf("%d",&queryId);
map<int,string> :: iterator it = awardList.find(queryId);
if(it != awardList.end()){
printf("%04d: ",it->first);
cout << it->second << endl;
awardList[queryId] = "Checked";
}
else {
printf("%04d: Are you kidding?\n",queryId);
}
}
}

4.测试用例

6
1111
6666
8888
1234
5555
0001
6
8888
0001
1111
2222
8888
2222


6
1111
6666
8888
1234
5555
0001
1
8888


6
1111
6666
8888
1234
5555
0001
3
1111
1111
1111

5.执行结果

PAT 1116 C++ 版_#include

6.坑点

  • 注意在判断素数时,​​sqrt()​​​函数的使用。是​​for(int i = 2;i <= sqrt(number); i++)​​​ 而不是 ​​for(int i = 2;i < sqrt(number); i++)​​​。
    例如,对于数字8,其​​​sqrt(8)​​之后的值是2,如果再不等于2,则会错判其是素数,而实质上其是偶数。