【PAT甲级】字符串处理及进制转换专题

字符串处理

插入: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;
}

猜你喜欢

转载自blog.csdn.net/K_Xin/article/details/113836864