PAT A1116 Come on! Let‘s C

题目描述

在这里插入图片描述

知识点

素数

实现

码前思考

  1. 就是很简单的素数的判断,思维量不大

代码实现

#include "bits/stdc++.h" 
using namespace std;

//最大的排名
const int maxn = 1e4+10;

//是否是质数
bool isPrime[maxn];

map<int,int> n2r;
set<int> isChecked;  

int n;
int k;

void computePrime(){
	//素数的计算要从2开始,1不是素数! 
	for(int i=2;i<=maxn;i++){
		if(isPrime[i] == true){
			//如果是质数,那么需要进行更新
			for(int j=i+i;j<=maxn;j+=i){
				isPrime[j] = false;
			} 
		}
	}
	return;
}

int main(){
	fill(isPrime,isPrime+maxn,true);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int id;
		scanf("%d",&id);
		n2r[id] = i;
	}
	//下面进行素数打表
	computePrime();	
	//然后进行读入
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		int id;
		scanf("%d",&id);
		printf("%04d: ",id);
		//如果id有效 
		if(n2r.count(id) != 0){
			if(isChecked.find(id) == isChecked.end()){//没有询问过 
				if(n2r[id] == 1){
					printf("Mystery Award\n");
				}else if(isPrime[n2r[id]] == true){
					printf("Minion\n");
				}else{
					printf("Chocolate\n");
				}
				isChecked.insert(id);
			}else{
				printf("Checked\n");
			}
		}else{
			printf("Are you kidding?\n");
		}
	} 
	return 0;
}

码后反思

  1. 这里用到了mapsetmap我已经会用了,但是set我用的还不熟,需要单独写一篇博客整理一下!

二刷代码

  1. 最好在素数筛里面写上p[0]=1,p[1]=1,不然很有可能出错;
  2. 访问之后记得设置为visited;
  3. 素数筛里面要写成j<maxn,不能写成<=
  4. 记得调用findPrime函数,不然白写了。。。
//采用哈希解题 
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;

int rklist[maxn];
bool vis[maxn]={0};
bool in[maxn]={0};
bool p[maxn]={0};//素数表 
int n;
int k;
 
void findPrime(){
	p[0]=1;p[1]=1;
	for(int i=2;i<maxn;i++){
		if(!p[i]){
			for(int j=i+i;j<maxn;j+=i){
				p[j]=1;
			}
		}
	}
	return;
}
 
int main(){
	findPrime();
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		int cur;
		scanf("%d",&cur);
		rklist[cur]=i+1;
		in[cur]=true;
	}
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		int cur;
		scanf("%d",&cur);
		printf("%04d: ",cur);
		
		if(in[cur]==false){
			printf("Are you kidding?\n"); 
			continue;
		}
		
		
		if(vis[cur]==true){
			printf("Checked\n");
		}else{
			if(rklist[cur]==1){
				printf("Mystery Award\n");
				vis[cur]=true;
			}else{
				vis[cur]=true;
				if(!p[rklist[cur]]){
					printf("Minion\n");
				}else{
					printf("Chocolate\n");
				}				
			}
		}
	} 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值