PAT乙级1091-1095
1091 N-自守数 (15 分)
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”。例如 3,而 2 的末尾两位正好是 9,所以 9 是一个 3-自守数。
本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数。
输入格式:
输入在第一行中给出正整数 M(≤),随后一行给出 M 个待检测的、不超过 1000 的正整数。
输出格式:
对每个需要检测的数字,如果它是 N-自守数就在一行中输出最小的 N 和 NK2 的值,以一个空格隔开;否则输出 No
。注意题目保证 0。
输入样例:
3
92 5 233
输出样例:
3 25392
1 25
No
代码:
#include<iostream> using namespace std; int main() { int n; cin >> n; for (int i = 0; i < n; ++i) { int num; bool flag = false; cin >> num; int square = num * num; string str1 = to_string(num); int len = str1.length(); for (int i = 1; i < 10; ++i) { int temp = i * square; string str2 = to_string(temp); string test(str2.end()-len, str2.end()); if (test == str1) { flag = true; cout << i << " " << temp << endl; break; } } if (!flag) cout << "No" << endl; } return 0; }
1092 最好吃的月饼 (20 分)
月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种。
若想评比出一种“最好吃”的月饼,那势必在吃货界引发一场腥风血雨…… 在这里我们用数字说话,给出全国各地各种月饼的销量,要求你从中找出销量冠军,认定为最好吃的月饼。
输入格式:
输入首先给出两个正整数 N(≤)和 M(≤),分别为月饼的种类数(于是默认月饼种类从 1 到 N 编号)和参与统计的城市数量。
接下来 M 行,每行给出 N 个非负整数(均不超过 1 百万),其中第 i 个整数为第 i 种月饼的销量(块)。数字间以空格分隔。
输出格式:
在第一行中输出最大销量,第二行输出销量最大的月饼的种类编号。如果冠军不唯一,则按编号递增顺序输出并列冠军。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
5 3
1001 992 0 233 6
8 0 2018 0 2008
36 18 0 1024 4
输出样例:
2018
3 5
代码:
#include<iostream> #include<vector> using namespace std; int main() { int m, n; cin >> m >> n; vector<int> kinds(m+1, 0); for (int i = 0; i < n; ++i) { for (int j = 1; j <= m; ++j) { int num; cin >> num; kinds[j] += num; } } int maxNum = 0; for (int i = 1; i <= m; ++i) if (kinds[i] > maxNum) maxNum = kinds[i]; cout << maxNum << endl; int i; for (i = 1; i <= m; ++i) if (kinds[i] == maxNum) { cout << i++; break; } for ( ; i <= m; ++i) if (kinds[i] == maxNum) cout << " " << i; cout << endl; return 0; }
1093 字符串A+B (20 分)
给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。
输入格式:
输入在两行中分别给出 A 和 B,均为长度不超过 1的、由可见 ASCII 字符 (即码值为32~126)和空格组成的、由回车标识结束的非空字符串。
输出格式:
在一行中输出题面要求的 A 和 B 的和。
输入样例:
This is a sample test
to show you_How it works
输出样例:
This ampletowyu_Hrk
代码:
#include<iostream> #include<string> #include<set> using namespace std; int main() { string str1, str2; string ans = ""; set<char> lib; getline(cin, str1); getline(cin, str2); for (int i = 0; i < str1.length(); ++i) { if (!lib.count(str1[i])) { ans += str1[i]; lib.insert(str1[i]); } } for (int i = 0; i < str2.length(); ++i) { if (!lib.count(str2[i])) { ans += str2[i]; lib.insert(str2[i]); } } cout << ans << endl; return 0; }
1094 谷歌的招聘 (20 分)
2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘。内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 10 位素数,这个素数是自然常数 e 中最早出现的 10 位连续数字。能找出这个素数的人,就可以通过访问谷歌的这个网站进入招聘流程的下一步。
自然常数 e 是一个著名的超越数,前面若干位写出来是这样的:e = 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921... 其中粗体标出的 10 位数就是答案。
本题要求你编程解决一个更通用的问题:从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数。
输入格式:
输入在第一行给出 2 个正整数,分别是 L(不超过 1000 的正整数,为数字长度)和 K(小于 10 的正整数)。接下来一行给出一个长度为 L 的正整数 N。
输出格式:
在一行中输出 N 中最早出现的 K 位连续数字所组成的素数。如果这样的素数不存在,则输出 404
。注意,原始数字中的前导零也计算在位数之内。例如在 200236 中找 4 位素数,0023 算是解;但第一位 2 不能被当成 0002 输出,因为在原始数字中不存在这个 2 的前导零。
输入样例 1:
20 5
23654987725541023819
输出样例 1:
49877
输入样例 2:
10 3
2468024680
输出样例 2:
404
1095 解码PAT准考证 (25 分)
PAT 准考证号由 4 部分组成:
- 第 1 位是级别,即
T
代表顶级;A
代表甲级;B
代表乙级; - 第 2~4 位是考场编号,范围从 101 到 999;
- 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位;
- 最后 11~13 位是考生编号,范围从 000 到 999。
现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。
输入格式:
输入首先在一行中给出两个正整数 N(≤)和 M(≤),分别为考生人数和统计要求的个数。
接下来 N 行,每行给出一个考生的准考证号和其分数(在区间 [ 内的整数),其间以空格分隔。
考生信息之后,再给出 M 行,每行给出一个统计要求,格式为:类型 指令
,其中
类型
为 1 表示要求按分数非升序输出某个指定级别的考生的成绩,对应的指令
则给出代表指定级别的字母;类型
为 2 表示要求将某指定考场的考生人数和总分统计输出,对应的指令
则给出指定考场的编号;类型
为 3 表示要求将某指定日期的考生人数分考场统计输出,对应的指令
则给出指定日期,格式与准考证上日期相同。
输出格式:
对每项统计要求,首先在一行中输出 Case #: 要求
,其中 #
是该项要求的编号,从 1 开始;要求
即复制输入给出的要求。随后输出相应的统计结果:
类型
为 1 的指令,输出格式与输入的考生信息格式相同,即准考证号 成绩
。对于分数并列的考生,按其准考证号的字典序递增输出(题目保证无重复准考证号);类型
为 2 的指令,按人数 总分
的格式输出;类型
为 3 的指令,输出按人数非递增顺序,格式为考场编号 总人数
。若人数并列则按考场编号递增顺序输出。
如果查询结果为空,则输出 NA
。
输入样例:
8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999
输出样例:
Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA
代码:
#include<iostream> #include<map> #include<vector> #include<algorithm> using namespace std; int n, m; struct Student{ string str; char grade; string classroom; string date; string num; int score; } p[10005]; bool cmp1(Student a, Student b) { if (a.score == b.score) return a.num > b.num; else return a.score > b.score; } bool cmp3(pair<string, int> a, pair<string, int> b) { if (a.second == b.second) return a.first < b.first; else return a.second > b.second; } void function1(string cmd, int num) { char grade = cmd[2]; cout << "Case " << num << ": " << cmd << endl; //cout << "Program in function1" << endl; for (int i = 0; i < n; ++i) { //cout << p[i].grade << ' ' << grade << endl; if (p[i].grade == grade) cout << p[i].str << endl; } } void function2(string cmd, int num) { string classroom = cmd.substr(2); cout << "Case " << num << ": " << cmd << endl; int _num = 0; int sum = 0; bool flag = false; for (int i = 0; i < n; ++i) { if (p[i].classroom == classroom) { flag = true; _num++; sum += p[i].score; } } if (flag) cout << _num << " " << sum << endl; else cout << "NA" << endl; } void function3(string cmd, int num) { string date = cmd.substr(2); cout << "Case " << num << ": " << cmd << endl; // cout << "+++++++ Programe in function3 ++++++++" << endl; map<string, int> m; for (int i = 0; i < n; ++i) { // cout << p[i].date << " " << date << endl; if (p[i].date == date) m[p[i].classroom]++; } // cout << m.size() << endl; vector<pair<string, int>> temp(m.begin(), m.end()); sort(temp.begin(), temp.end(), cmp3); if (temp.size() > 0) cout << temp[0].first << " " << temp[0].second; for (int i = 1; i < temp.size(); ++i) { cout << endl; cout << temp[i].first << " " << temp[i].second; } } int main() { cin >> n >> m; getchar(); for (int i = 0; i < n; ++i) { string stu; getline(cin, stu); char grade = stu[0]; string classroom = stu.substr(1, 3); //cout << classroom << endl; string date = stu.substr(4, 6); string num = stu.substr(10, 3); string score = stu.substr(13); //cout << grade << classroom << date << num << score << endl; p[i].str = stu; p[i].grade = grade; p[i].classroom = classroom; p[i].date = date; p[i].num = num; p[i].score = stoi(score); } sort(p, p+n, cmp1); for (int i = 0; i < m; ++i) { string cmd; getline(cin, cmd); //cout << cmd << endl; int _n = cmd[0] - '0'; switch (_n) { case 1: function1(cmd, i+1); break; case 2: function2(cmd, i+1); break; case 3: function3(cmd, i+1); break; default: break; } } return 0; }
题解:
前面的四道题都是一遍过的,但是最后一道题,调试了很久,最后就通过一组数据得了15分,也不知道是哪里被卡了。