PAT每日三题

1059 C语言竞赛

分数 20

作者 CHEN, Yue

单位 浙江大学

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?
#include<iostream>
#include<vector>
#include<map>
#include<cmath>
#include<set>
using namespace std;

bool is_prime(int p) {
	if (p < 2) {
		return false;
	}
	else if (p == 2) {
		return true;
	}
	else if (p % 2 == 0) {
		return false;
	}
	else {
		for (int i = 3; i <=sqrt(p); i += 2) {
			if (p % i == 0) {
				return false;
			}
		}
		return true;
	}
	
}


int main() {

	int n;
	cin >> n;
	map<string, int> arr;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		arr[s] = i + 1;
	}
	int m;
	cin >> m;
	set<string> same;
	for (int i = 0; i < m; i++) {
		string s;
		cin >> s;
		
		if (arr.find(s) == arr.end()) {
			cout << s << ": Are you kidding?" << endl;
		}
		else if (same.find(s) != same.end()) {
			cout << s << ": Checked" << endl;
		}
		else if (arr[s] == 1) {
			cout << s << ": Mystery Award" << endl;
		}
		else if (is_prime(arr[s])) {
			cout << s << ": Minion" << endl;
		}
		else {
			cout << s << ": Chocolate" << endl;
		}
		same.insert(s);
	}



	return 0;
}

1118 如需挪车请致电

分数 20

作者 陈越

单位 浙江大学

phone.jpg

上图转自新浪微博。车主用一系列简单计算给出了自己的电话号码,即:

2/2=1、3+2=5、9​=3、9​=3、0%=0、叁=3、5−2=3、9/3=3、1×3=3、23=8、8/2=4,最后得到的电话号码就是 153 3033 3384。

本题就请你写个程序自动完成电话号码的转换,以帮助那些不会计算的人。

输入格式:

输入用 11 行依次给出 11 位数字的计算公式,每个公式占一行。这里仅考虑以下几种运算:加(+)、减(-)、乘(*)、除(/)、取余(%,注意这不是上图中的百分比)、开平方根号(sqrt)、指数(^)和文字(即 0 到 9 的全小写汉语拼音,如 ling 表示 0)。运算符与运算数之间无空格,运算数保证是不超过 1000 的非负整数。题目保证每个计算至多只有 1 个运算符,结果都是 1 位整数。

输出格式:

在一行中给出电话号码,数字间不要空格。

输入样例:

2/2
3+2
sqrt9
sqrt9
6%2
san
5-2
9/3
1*3
2^3
8/2

输出样例:

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


int main() {

	map<string, int> f = {
		{"ling",0},{"yi",1},{"er",2},{"san",3},{"si",4},{"wu",5},
		{"liu",6},{"qi",7},{"ba",8},{"jiu",9}
	};
	vector<int> arr(11);
	//注意题目说的是至多有一个运算符,也就是可能出现纯数字情况
	for (int j = 0; j < 11; j++) {
		string input;
		cin >> input;
		if (input[0] >= '0' && input[0] <= '9' &&input.size()!=1) {
			string s = "";
			s += input[0];
			int i = 1;
			//注意input.size()
			while (i < input.size() && input[i] >= '0' && input[i] <= '9') {
				s += input[i];
				i++;
			}
			char t = input[i];
			i++;
			string e = input.substr(i);

			
			if (t == '+') {
				arr[j] = stoi(s) + stoi(e);
			}
			else if (t == '-') {
				arr[j] = stoi(s) - stoi(e);
			}
			else if (t == '*') {
				arr[j] = stoi(s) * stoi(e);
			}
			else if (t == '/') {
				if (stoi(e) == 0) {
					arr[j] = 0;
				}
				else {
					arr[j] = stoi(s) / stoi(e);
				}

				

			}
			else if (t == '%') {
				arr[j] = stoi(s) % stoi(e);
			}
			else if (t == '^') {
				//stoi(e)-1==-1时是无符号比较
				arr[j] = 1;
				for (int i = 0; i < stoi(e); i++) {
					arr[j] *= stoi(s);
				}
				
			}
		}
		else if(input.size()!=1){
			if (input[0] == 's' && input[1] == 'q') {
				string e = input.substr(4);
				arr[j] = sqrt(stoi(e));
			}
			else {
				arr[j] = f[input];
			}
		}
		else if (input.size() == 1) {
			arr[j] = stoi(input);
		}

	}
	for (int i : arr) {
		cout << i;
	}
	

	return 0;
}

1117 数字之王

分数 20

作者 陈越

单位 浙江大学

给定两个正整数 N1​<N2​。把从 N1​ 到 N2​ 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止。这时哪个数字最多,哪个就是“数字之王”。

例如 N1​=1 和 N2​=10 时,第一轮操作后得到 { 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };第二轮操作后得到 { 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };第三轮操作后得到 { 1, 8, 8, 0, 8, 8, 0, 8, 8, 0 }。所以数字之王就是 8。

本题就请你对任意给定的 N1​<N2​ 求出对应的数字之王。

输入格式:

输入在第一行中给出两个正整数 0<N1​<N2​≤103,其间以空格分隔。

输出格式:

首先在一行中输出数字之王的出现次数,随后第二行输出数字之王。例如对输入 1 10 就应该在两行中先后输出 68。如果有并列的数字之王,则按递增序输出。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10 14

输出样例:

2
0 8
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
using namespace std;

//计算位数和
int fun(int s) {
	long long r = 1;
	long long p = 0;
	/*for (int i = 0; i < s.size(); i++) {
		int t = (s[i] - '0');
		r = r * t*t*t;
	}*/
	while (s) {
		int t = s % 10;
		r = r * t * t * t;
		s /= 10;
	}
	while (r) {
		p += r % 10;
		r /= 10;
	}
	return p;
}

//判断是否都<=10
bool fun1(vector<long long> a) {
	for (int i = 0; i < a.size(); i++) {
		if (a[i] >= 10) {
			return true;
		}
	}
	return false;
}


int main() {

	int a, b;
	cin >> a >> b;
	vector<long long> arr(b - a + 1);
	for (int i = a; i <= b; i++) {
		/*arr[i - a] = i;*/
		arr[i - a] = i;
		arr[i - a] = fun(arr[i - a]);
	}
	while (fun1(arr)) {
		for (int i = a; i <= b; i++) {
			/*arr[i - a] = i;*/
			/*arr[i - a] = arr[i - a] * arr[i - a] * arr[i - a];*/
			if (arr[i - a] == 0) continue;
			arr[i - a] = fun(arr[i - a]);
			
		}
	}
	//!!!找众数
	map<long long, int> brr;
	for (int i = 0; i < arr.size(); i++) {
		brr[arr[i]] ++;
	}
	int m = 0;
	int p = 0;
	for (auto i : brr) {
		if (i.second > m) {
			m = i.second;
			p = i.first;
		}
	}
	vector<long long> r;
	
	for (auto i : brr) {
		if (i.second == m) {
			r.push_back(i.first);
		}
		
	}
	if (r.size() > 1) {
		sort(r.begin(), r.end());
	}
	cout << brr[r[0]] << endl;
	for (int i = 0; i < r.size(); i++) {
		cout << r[i];
		if (i != r.size() - 1) {
			cout << " ";
		}
	}


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值