目录
-
- 字符串处理
-
-
- PAT甲级 1001 A+B Format (20 分)
- PAT甲级1005 Spell It Right (20 分)
- PAT甲级1035 Password (20 分)
- PAT甲级 1061 Dating (20 分) / PAT 乙级 1014 福尔摩斯的约会 (20分)
- PAT甲级 1038 Recover the Smallest Number (30 分)
- PAT甲级 1060 Are They Equal (25 分)
- PAT甲级 1073 Scientific Notation (20 分) / PAT 乙级 1024 科学计数法
- PAT甲级 1077 Kuchiguse (20 分)
- PAT甲级 1108 Finding Average (20 分) / PAT乙级 1054 求平均值 (20分)
- PAT甲级 1140 Look-and-say Sequence (20 分) / PAT乙级 1084 外观数列
- PAT甲级 1152 Google Recruitment (20 分) / PAT 乙级 1094 谷歌的招聘 (20分)
- PAT甲级 1082
- PAT乙级 1052 卖个萌
-
- 进制转换
-
-
- PAT甲级 1015 Reversible Primes (20 分)
- PAT甲级 1019 General Palindromic Number (20分)
- PAT甲级 1023 Have Fun with Numbers (20 分)
- PAT甲级 1024 Palindromic Number (25 分)
- PAT甲级 1136 A Delayed Palindrome (20分) / PAT 乙级 1079 延迟的回文数 (20 分)
- PAT甲级 1069 The Black Hole of Numbers (20 分) / PAT乙级 1019 数字黑洞
- PAT乙级 1074 宇宙无敌加法器
- PAT甲级 1027 Colors in Mars (20 分)
- PAT甲级 1100 Mars Numbers (20 分) / PAT乙级 1044 火星数字 (20分)
- PAT甲级 1058 A+B in Hogwarts (20 分)
-
字符串处理
插入:insert(pos, s)
insert(it, s.begin(), s.end())
删除:erase(it)
erase(s.begin(), s.end()) = clear()
截取:substr(pos, len)
寻找子串:find(s)
替换子串:replace(pos, len, s)
replace(s.begin(), s.end(), s1)
// 消前导0
while(s.length() != 0 && s[0] == '0') s.erase(s.begin());
if(s.length() == 0) cout << 0;
cout << s;
PAT甲级 1001 A+B Format (20 分)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
string s = to_string(a + b);
string r = s;
if (s[0] == '-') {
// 处理负号
cout << "-";
r = s.substr(1);
}
string result; // 设置新字符串,以免添加逗号字符串变长
reverse(r.begin(), r.end()); // 倒序添加逗号
for (int i = 0; i < r.size(); i++) {
result.push_back(r[i]);
if ((i+1) % 3 == 0 && (i+1) != r.size()) result.push_back(',');
}
reverse(result.begin(), result.end());
cout << t << endl;
return 0;
}
PAT甲级1005 Spell It Right (20 分)
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
// 字符串数组
string num[]={
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int main() {
string s;
cin >> s;
int sum = 0;
for (int i = 0; s[i] != '\0'; i++)
sum += s[i] - '0';
s = to_string(sum);
if (s[0] == '0') cout << num[0]; // 结果为0的情况
else {
for (int i = 0; i < s.size(); i++) {
cout << num[s[i]-'0'];
if (i != s.size()-1) cout << " ";
}
}
return 0;
}
PAT甲级1035 Password (20 分)
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
map<char, char> change = {
{
'1', '@'}, {
'0', '%'}, {
'l', 'L'}, {
'O', 'o'}
};
vector<string> v;
int main() {
int n = 0;
cin >> n;
for (int i = 0; i < n; i++) {
string name, s;
cin >> name >> s;
bool flag = false;
for (int j = 0; j < s.size(); j++) {
if (change[s[j]]) {
// 字符替换映射
flag = true; s[j] = change[s[j]];
}
}
if (flag) v.push_back(name + ' ' + s); // 整行保存存字符串
}
if (v.size() > 0) {
cout << v.size() << endl;
for (int i = 0; i < v.size(); i++)
cout << v[i] << endl;
}
else if (n == 1) cout << "There is 1 account and no account is modified" << endl;
else cout << "There are " << n << " accounts and no account is modified" << endl;
return 0;
}
PAT甲级 1061 Dating (20 分) / PAT 乙级 1014 福尔摩斯的约会 (20分)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string week[] = {
"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN" };
int main() {
string a, b, c, d;
cin >> a >> b >> c >> d;
int i;
for (i = 0; i < a.size() && i < b.size(); i++) {
if (a[i] == b[i] && (a[i] >= 'A' && a[i] <= 'G')) {
cout << week[a[i] - 'A'] << " ";
break;
}
}
for (i++; i < a.size() && i < b.size(); i++) {
if (a[i] == b[i] && (a[i] >= '0' && a[i] <= '9')) {
printf("%02d:", a[i] - '0');
break;
} else if (a[i] == b[i] && (a[i] >= 'A' && a[i] <= 'N')) {
printf("%02d:", a[i] - 'A' + 10);
break;
}
}
for (i = 0; i < c.size() && i < d.size(); i++) {
if (c[i] == d[i] && isalpha(c[i])) {
printf("%02d", i);
break;
}
}
return 0;
}
PAT甲级 1038 Recover the Smallest Number (30 分)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool cmp(string a, string b) {
return a+b < b+a;
}
string str[10010];
string s;
int main() {
int n = 0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> str[i];
sort(str, str+n,cmp);
for (int i = 0; i < n; i++)
s += str[i];
while(s.length() != 0 && s[0] == '0') s.erase(s.begin());
if(s.length() == 0) cout << 0;
cout << s;
return 0;
}
PAT甲级 1060 Are They Equal (25 分)
自然数 → \to → 科学计数法:搜索尾数和指数
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string format(string s, int n) {
while (s.length() > 0 && s[0] == '0') s.erase(s.begin());
int e = 0;
if (s[0] == '.') {
s.erase(s.begin());
while (s.length() > 0 && s[0] == '0') {
s.erase(s.begin()); e--;
}
}
else {
int k = 0;
while (k < s.length() && s[k] != '.') {
k++; e++;
}
if (k < s.length()) s.erase(s.begin() + k);
}
if (s.length() == 0) e = 0;
int len = 0;
string res = "0.";
for (int i = 0; i < n; i++) {
if (len < s.length()) res += s[len++];
else res += '0';
}
res = res + "*10^" + to_string(e);
return res;
}
int main() {
int n = 0;
string a, b, s1, s2;
cin >> n >> a >> b;
s1 = format(a, n);
s2 = format(b, n);
if (s1 == s2) {
cout << "YES " << s1 << endl;
}
else {
cout << "NO " << s1 << " " << s2 << endl;
}
return 0;
}
PAT甲级 1073 Scientific Notation (20 分) / PAT 乙级 1024 科学计数法
科学计数法 → \to → 自然数: s.substr()
截取指数和尾数
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
if (s[0] == '-') cout << s[0];
int pos = s.find('E');
string integer = s.substr(1,1);
string point = s.substr(3,pos-3);
int expon = stoi(s.substr(pos+1));
if (expon == 0) {
cout << integer << "." << point << endl;
}
else if (expon < 0) {
cout << "0.";
for (int i = 0; i < abs(expon)-1; i++)
cout << "0";
cout << integer << point << endl;
}
else {
cout << integer;
int length = point.size();
if (length < expon) {
// 尾数位数 < 指数
cout << point;
for (int i = 0; i < expon - length; i++)
cout << "0";
}
else {
for (int i = 0; i < length; i++) {
// 尾数位数 > 指数
cout << point[i];
if (length-expon > 0 && i == expon-1)
cout << ".";
}
}
}
return 0;
}
PAT甲级 1077 Kuchiguse (20 分)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
// 最长公共后缀
int n;
cin >> n;
getchar();
vector<string> v(n);
int minn = 256;
for (int i = 0; i < n; i++) {
getline(cin, v[i]); // 按行存储字符串
if (v[i].size() < minn) minn = v[i].size(); // 应该比较的最短长度
reverse(v[i].begin(), v[i].end()); // 反转以便比较后缀
}
int cnt = 0;
for (int j = 0; j < minn; j++) {
bool flag = true;
for (int i = 1; i < n; i++) {
if (v[0][j] != v[i][j]) {
// 逐个比较
flag = false; break;
}
}
if (!flag) break;
cnt++;
}
if (cnt == 0) cout << "nai" << endl;
else {
string s = v[0].substr(0, cnt);
reverse(s.begin(), s.end());
cout << s << endl;
}
return 0;
}
PAT甲级 1108 Finding Average (20 分) / PAT乙级 1054 求平均值 (20分)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
int n = 0, cnt = 0;
scanf("%d", &n);
char a[50], b[50];
double temp = 0.0, sum = 0.0;
for (int i = 0; i < n; i++) {
scanf("%s", a);
sscanf(a, "%lf", &temp); // 字符数组->浮点数
sprintf(b, "%.2lf", temp); // 浮点数->字符数组
bool flag = false;
for (int j = 0; j < strlen(a); j++)
if (a[j] != b[j]) flag = true;
if (flag || temp < -1000 || temp > 1000) {
// 非法输入
printf("ERROR: %s is not a legal number\n", a);
continue;
}
else {
sum += temp; cnt++; // 总和及个数
}
}
if(cnt == 1)
printf("The average of 1 number is %.2f", sum);
else if(cnt > 1)
printf("The average of %d numbers is %.2f", cnt, sum / cnt);
else
printf("The average of 0 numbers is Undefined");
return 0;
}
PAT甲级 1140 Look-and-say Sequence (20 分) / PAT乙级 1084 外观数列
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int d = 0, n = 0;
cin >> d >> n;
string s = to_string(d); // 首字符
for (int i = 0; i < n-1; i++) {
// 当 n>=2 处理字符串
string t;
int same = 1, len = s.size();
for (int j = 0; j < len; j++) {
if (j+1 == len) {
// 末尾字符单独处理
t += s[j];
t += to_string(same);
}
else {
if (s[j] == s[j+1]) same++; // 段内连续相等字符数
else {
t += s[j];
t += to_string(name);
same = 1; // 还原下一段相等计数器
}
}
}
s = t; // 上一轮生成字符串作为下一轮检查的字符串
}
cout << s << endl;
return 0;
}
PAT甲级 1152 Google Recruitment (20 分) / PAT 乙级 1094 谷歌的招聘 (20分)
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
bool IsPrime(int prime){
if(prime < 2) return false;
int limit = int(sqrt(prime*1.0));
for(int i=2; i <= limit; i++){
if(prime % i == 0) return false;
}
return true;
}
int main() {
int l = 0, k = 0;
string n;
cin >> l >> k >> n;
int prime = 0;
string s;
for (int i = 0; i <= l-k; i++) {
s = n.substr(i,k);
prime = stoi(s);
if (IsPrime(prime)) {
cout << s << endl;
return 0;
}
}
cout << "404" << endl;
return 0;
}
PAT甲级 1082
PAT乙级 1052 卖个萌
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s[3];
for (int i = 0; i < 3; i++) // 原字符串行
getline(cin, s[i]);
vector<string> v[3];
for (int i = 0; i < 3; i++) {
int start = 0, stop = 0;
for (int j = 0; j < s[i].size(); j++) {
if (s[i][j] == '[') {
start = j+1; stop = 0;
}
else if (s[i][j] == ']') {
v[i].push_back(s[i].substr(start, stop)); // [表情]向量
}
else {
stop++;
}
}
}
int n = 0;
cin >> n;
for (int i = 0; i < n; i++) {
int arr[5] = {
0};
bool flag = false;
for (int i = 0; i < 5; i++) {
cin >> arr[i];
if (arr[i] < 1) flag = true; // 序号过小
}
int len1 = v[0].size(), len2 = v[1].size(), len3 = v[2].size();
if (arr[0] > len1 || arr[1] > len2 || arr[2] > len3 || arr[3] > len2 || arr[4] > len1) // 序号过大
flag = true;
if (flag) cout << "Are you kidding me? @\\/@" << endl;
else {
cout << v[0][arr[0]-1] << "(" << v[1][arr[1]-1] << v[2][arr[2]-1] << v[1][arr[3]-1] << ")" << v[0][arr[4]-1] << endl;
}
}
return 0;
}
进制转换
PAT甲级 1015 Reversible Primes (20 分)
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
bool IsPrime(int n) {
if (n < 2) return false;
int limit = int(sqrt(n*1.0));
for (int i = 2; i <= limit; i++)
if (n % i == 0) return false;
return true;
}
int reverse(int n, int base) {
vector<int> v;
while (n != 0) {
// 除基取余获取反转数字
v.push_back(n % base);
n /= base;
}
int result = 0, temp = 1; // 反转数字的值
for (int i = v.size()-1; i >= 0; i--) {
result += v[i] * temp;
temp *= base;
}
return result;
}
int main() {
int n = 0, base = 0;
while (cin >> n && n >= 0) {
cin >> base;
int r = reverse(n, base);
if (IsPrime(n) && IsPrime(r)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
PAT甲级 1019 General Palindromic Number (20分)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> palin(int n, int radix) {
// 进制转换
vector<int> v; // 十进制以上需要保存多位,所以不能使用 string 存储
while (n != 0) {
v.push_back( n % radix );
n /= radix;
}
return v;
}
int main() {
int n = 0, radix = 0;
cin >> n >> radix;
vector<int> v = palin(n, radix);
if (v.size() == 0) {
cout << "Yes" << endl;
cout << 0 << endl;
return 0;
}
vector<int> vec = v;
reverse(vec.begin(), vec.end());
if (vec == v) cout << "Yes" << endl;
else cout << "No" << endl;
for (int i = 0; i < vec.size(); i++) {
cout << vec[i];
if (i != vec.size()-1) cout << " ";
}
return 0;
}
PAT甲级 1023 Have Fun with Numbers (20 分)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string compute(string s, string r) {
string k;
int temp = 0, carry = 0;
for (int i = 0; i < s.size(); i++) {
// 模拟竖式加法
temp = (s[i]-'0') + (r[i]-'0')+ carry; // 相加
k += to_string(temp % 10); // 低位余数
carry = temp / 10; // 高位进位
}
if (carry != 0) k += to_string(carry); // 最高位进位
reverse(k.begin(),k.end());
return k;
}
int main() {
string s, r;
cin >> s;
reverse(s.begin(), s.end());
r = compute(s, s);
string a = s, b = r;
sort(a.begin(), a.end());
sort(b.begin(), b.end());
if (a == b) cout << "Yes" <<endl;
else cout << "No" << endl;
cout << r << endl;
return 0;
}
PAT甲级 1024 Palindromic Number (25 分)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string compute(string s, string r) {
string k;
int temp = 0, carry = 0;
for (int i = 0; i < s.size(); i++) {
// 模拟竖式加法
temp = (s[i]-'0') + (r[i]-'0')+ carry; // 相加
k += to_string(temp % 10); // 低位余数
carry = temp / 10; // 高位进位
}
if (carry != 0) k += to_string(carry); // 最高位进位
reverse(k.begin(),k.end());
return k;
}
int main() {
int k = 0;
string s;
cin >> s >> k;
string r = s;
reverse(r.begin(), r.end());
if (s == r) {
cout << r << endl << 0 << endl;
return 0;
}
int cnt = 0;
while (cnt < k) {
s= compute(s, r);
r = s;
reverse(s.begin(), s.end());
cnt++;
if (s == r) break;
}
cout << r << endl << cnt << endl;
return 0;
}
PAT甲级 1136 A Delayed Palindrome (20分) / PAT 乙级 1079 延迟的回文数 (20 分)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string compute(string s, string r) {
string k;
int temp = 0, carry = 0;
for (int i = 0; i < s.size(); i++) {
// 模拟竖式加法
temp = (s[i]-'0') + (r[i]-'0')+ carry; // 相加
k += to_string(temp % 10); // 低位余数
carry = temp / 10; // 高位进位
}
if (carry != 0) k += to_string(carry); // 最高位进位
reverse(k.begin(),k.end());
return k;
}
int main() {
string s;
cin >> s;
string r = s;
reverse(r.begin(), r.end());
if (s == r) {
cout << s << " is a palindromic number." << endl;
return 0;
}
int cnt = 0;
while (cnt++ < 10) {
string k = compute(s, r); // string k = to_string( stoll(s) + stoll(r) ); 最后一个样例超时
cout << s << " + " << r << " = " << k << endl;
s = k; r = s;
reverse(r.begin(), r.end());
if (s == r) {
cout << s << " is a palindromic number." << endl;
break;
}
}
if (cnt == 11) cout << "Not found in 10 iterations." << endl;
return 0;
}
PAT甲级 1069 The Black Hole of Numbers (20 分) / PAT乙级 1019 数字黑洞
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool cmp(char a, char b) {
return a > b;
}
int main() {
string s;
cin >> s;
s.insert(0, 4 - s.size(), '0');
do {
string a = s, b = s;
sort(a.begin(), a.end(), cmp);
sort(b.begin(), b.end());
int result = stoi(a) - stoi(b);
s = to_string(result);
s.insert(0, 4 - s.size(), '0'); // 添加前缀0
cout << a << " - " << b << " = " << s << endl;
} while (s != "0000" && s != "6174");
return 0;
}
PAT乙级 1074 宇宙无敌加法器
PAT甲级 1060 模拟竖式加法 + PAT甲级1136 清除前导零 + PAT甲级 1069 添加前导零
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> v;
string compute(string s, string r) {
string k;
int i, temp = 0, carry = 0;
for (i = 0; i < s.size(); i++) {
// 竖式加法
temp = (s[i]-'0') + (r[i]-'0')+ carry;
k += to_string(temp % v[i]);
carry = temp / v[i];
}
if (carry != 0) k += to_string(carry);
reverse(k.begin(),k.end());
return k;
}
int main() {
string s, a, b;
cin >> s >> a >> b;
while (a.length() != 0 && a[0] == '0') a.erase(a.begin()); // 清除无用前缀零
while (b.length() != 0 && b[0] == '0') b.erase(b.begin());
if (a.length() == 0 && b.length() == 0) {
// 计算结果为零
cout << 0 << endl; return 0;
}
if (a.length() > b.length()) b.insert(0, a.length()-b.length(), '0'); // 添加前缀零对齐
if (b.length() > a.length()) a.insert(0, b.length()-a.length(), '0');
reverse(s.begin(), s.end());
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
for (int i = 0; i < s.size(); i++) {
if (s[i] == '0') v.push_back(10); // 0表示十进制
else v.push_back(s[i] - '0');
}
cout << compute(a,b) << endl;
return 0;
}
PAT甲级 1027 Colors in Mars (20 分)
#include <iostream>
using namespace std;
int main() {
int a[3];
for (int i = 0; i < 3; i++)
scanf("%d", &a[i]);
printf("#");
for (int i = 0; i < 3; i++)
printf("%X%X", a[i]/13, a[i]%13); // 十六进制输出
printf("\n");
return 0;
}
PAT甲级 1100 Mars Numbers (20 分) / PAT乙级 1044 火星数字 (20分)
#include<iostream>
#include<string>
using namespace std;
string units[13] = {
"tret", "jan", "feb", "mar", "apr", "may", "jun", "jly", "aug", "sep", "oct", "nov", "dec"
};
string tens[13] = {
" ", "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mer", "jou"
};
void etom(int e) {
if (e / 13) cout << tens[e / 13];
if ((e / 13) && (e % 13)) cout << " ";
if (e % 13 || e == 0) cout << units[e % 13];
}
void mtoe(string s) {
string s1 = s.substr(0,3), s2;
if (s.size() > 4) s2 = s.substr(4,3);
int num1 = 0, num2 = 0;
for (int i = 1; i <= 12; i++) {
if (s1 == tens[i]) num1 = i;
if (s1 == units[i] || s2 == units[i]) num2 = i;
}
cout << num1*13 + num2;
}
int main() {
int n;
cin >> n;
getchar();
string s;
for (int i = 0; i < n; i++) {
getline(cin, s);
isdigit(s[0]) ? etom(stoi(s)) : mtoe(s);
cout << endl;
}
return 0;
}
PAT甲级 1058 A+B in Hogwarts (20 分)
#include <iostream>
using namespace std;
const int Galleon = 29*17;
const int Sickle = 29;
int main() {
long a1, b1, c1; // 用int可能会溢出
long a2, b2, c2;
scanf("%ld.%ld.%ld %ld.%ld.%ld", &a1, &b1, &c1, &a2, &b2, &c2);
long long c = (a1+a2)*Galleon + (b1+b2)*Sickle + c1 + c2;
printf("%ld.%ld.%ld", c/Galleon, c%Galleon/Sickle, c%Sickle);
return 0;
}