PAT甲级——1100 Mars Numbers (字符串操作、进制转换)

博客围绕地球十进制与火星13进制数字的相互转换展开。火星人用13进制计数,其数字以字符形式呈现。解题需映射火星数字与字符,用getline()函数读取数据,同时要注意火星数字超过13时,0 - 12映射字符的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1100 Mars Numbers (20 分)

People on Mars count their numbers with base 13:

  • Zero on Earth is called "tret" on Mars.
  • The numbers 1 to 12 on Earth is called "jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec" on Mars, respectively.
  • For the next higher digit, Mars people name the 12 numbers as "tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou", respectively.

For examples, the number 29 on Earth is called "hel mar" on Mars; and "elo nov" on Mars corresponds to 115 on Earth. In order to help communication between people from these two planets, you are supposed to write a program for mutual translation between Earth and Mars number systems.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<100). Then N lines follow, each contains a number in [0, 169), given either in the form of an Earth number, or that of Mars.

Output Specification:

For each number, print in a line the corresponding number in the other language.

Sample Input:

4
29
5
elo nov
tam

Sample Output:

hel mar
may
115
13

题目大意:火星人用13进制计数,把地球的十进制与火星的13进制相互转换,需要注意的是火星人的数字是字符形式。 

思路:映射火星人的数字与字符,用string存储读取的一整行数据,要调用getline()函数,它会读取一行里包括空格在内的所有字符。注意一下火星人的数字超过13时,0~12映射的字符也会变化,需要加入判断~

#include <iostream>
#include <string>
#include <map>
using namespace std;
string Earth_Mars[25] = { "tret",
						"jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec",
						"tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mer","jou" };
map <string, int> Mars_Earth;
void init();
void earthToMars(string &s);
void marsToEarth(string &s);
int main()
{
	init();
	int N;
	scanf("%d", &N);
	getchar();
	for (int i = 0; i < N; i++) {
		string s;
		getline(cin, s);
		if (s[0] >= '0' && s[0] <= '9')
			earthToMars(s);
		else
			marsToEarth(s);
	}
	return 0;
}
void marsToEarth(string &s) {
	if (s == "tret") {
		cout << Mars_Earth[s] << endl;
		return;
	}
	int size = s.size();
	if (size < 4)
		cout << Mars_Earth[s] << endl;
	else {
		string s1 = s.substr(0, 3),
			s2 = s.substr(4, 3);
		cout << Mars_Earth[s1] + Mars_Earth[s2] << endl;
	}
}
void earthToMars(string &s) {
	int earth = 0;
	for (int i = 0; i < s.length(); i++)
		earth = earth * 10 + s[i] - '0';
	if (earth <= 12) {
		cout << Earth_Mars[earth] << endl;
		return;
	}
	else if (earth % 13 == 0) {
		cout << Earth_Mars[earth / 13 + 12] << endl;
		return;
	}
	string mars[2];
	mars[1] = Earth_Mars[earth % 13];
	earth = earth / 13;
	mars[0] = Earth_Mars[earth + 12];
	cout << mars[0] << " " << mars[1] << endl;
}
void init() {
	for (int i = 0; i < 13; i++)
		Mars_Earth[Earth_Mars[i]] = i;
	for (int i = 13; i < 25; i++)
		Mars_Earth[Earth_Mars[i]] = (i - 12) * 13;
}

 

<think>好的,我现在需要帮助用户了解PAT考试中二进制字符串处理的方法。首先,我需要回忆一下PAT(Programming Ability Test)常见的题型和考察重点。根据用户提供的引用,特别是引用[2]和引用[3],PAT中涉及字符串处理、进制转换以及回文数判断等问题。 用户的问题集中在二进制字符串的处理上,所以我要整理相关的方法。首先,进制转换是基础,比如十进制转二进制,或者二进制与其他进制之间的转换。这可能涉及到字符串的反转、补位等操作。比如引用[2]中提到输入两个十进制数,输出它们的D进制数,这需要掌握如何将数字转换为字符串表示。 其次,字符串处理的具体操作,比如分割、拼接、反转等。例如,判断一个二进制字符串是否为回文,可能需要将其反转后比较。引用[3]中的例子,17的二进制是10001,属于回文数,这说明处理时需要将数字转换为二进制字符串再进行判断。 接下来,常见的PAT题目类型可能有二进制与十进制的相互转换、二进制字符串的运算(如加法)、回文判断、子串查找等。例如,处理二进制加法时,需要逐位相加并处理进位,类似于大数运算的方法。 然后,我需要考虑具体的实现方法。例如,在Python中,可以使用内置函数如bin()将十进制转为二进制字符串,但可能包含前缀'0b',需要去除。或者手动实现转换过程,通过除2取余法,这样更灵活,适合处理大数或需要特定格式的情况。 另外,字符串处理方面,比如补前导零使长度对齐,或者在处理不同进制的转换时,需要处理超过10进制的字符(如A-F),但用户问题主要关注二进制,所以可能不需要处理更高进制,但方法类似。 还要注意PAT考试中对效率的要求,可能需要优化算法,避免超时。例如,在判断回文数时,直接比较字符串和其反转是否相同,时间复杂度是O(n),是可以接受的。 最后,结合引用中的例子,比如引用[3]中的进制回文数问题,用户可能需要掌握如何将数字转换为不同进制的字符串,并检查是否为回文。这涉及到循环转换进制和字符串处理的两个步骤。 总结下来,回答应该涵盖进制转换的方法、字符串处理技巧、常见问题类型以及示例代码。同时,需要引用提供的参考资料中的相关内容,如引用[2]和[3]中的例题,来支持回答的可靠性。</think>在PAT考试中,二进制字符串处理是常见考点,主要涉及**进制转换**和**字符串操作**两个核心环节。以下是具体方法及示例: --- ### 一、二进制字符串处理方法 #### 1. 进制转换 - **十进制转二进制** 使用除2取余法,逆序拼接结果。例如将$6$转为二进制: ```python def dec_to_bin(n): if n == 0: return "0" res = [] while n > 0: res.append(str(n % 2)) n = n // 2 return ''.join(reversed(res)) # 反转得到正确顺序 ``` 输入`dec_to_bin(6)`输出`110`[^2]。 - **二进制转十进制** 按权展开求和,例如二进制`1011`: $$1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 11$$ #### 2. 字符串操作 - **补前导零** 对齐二进制位数时常用,例如将`110`补为8位: ```python s = '110' s = s.zfill(8) # 结果为'00000110' ``` - **反转字符串** 判断回文时需要反转,例如`101`反转后仍为`101`[^3]: ```python def is_palindrome(s): return s == s[::-1] ``` --- ### 二、PAT常见题型及示例 #### 1. 二进制回文数判断 **题目**:判断数字$n$在二进制下是否为回文。 **实现**: ```python def is_binary_palindrome(n): bin_str = bin(n)[2:] # 去掉'0b'前缀 return bin_str == bin_str[::-1] ``` #### 2. 二进制加法 **题目**:给定两个二进制字符串,求和。 **实现**: ```python def add_binary(a, b): max_len = max(len(a), len(b)) a = a.zfill(max_len) b = b.zfill(max_len) carry = 0 result = [] for i in range(max_len-1, -1, -1): bit_sum = int(a[i]) + int(b[i]) + carry result.append(str(bit_sum % 2)) carry = bit_sum // 2 if carry: result.append('1') return ''.join(reversed(result)) ``` --- ### 三、优化技巧 1. **使用位运算加速** 例如判断奇偶:`n & 1`比`n % 2`更快。 2. **预计算进制表** 处理多进制时,可用`digits = '0123456789ABCDEF'`简化转换逻辑。 3. **处理大数** PAT可能涉及大数运算,需用字符串模拟逐位计算。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值