(Python实现)PAT 1019 General Palindromic Number (20 分)

1019 General Palindromic Number (20 分)
A number that will be the same when it is written forwards or backwards is known as a Palindromic Number. For example, 1234321 is a palindromic number. All single digit numbers are palindromic numbers.
如果一个数字在向前或向后写的时候是相同的,那么这个数字就是回文数字。例如,1234321是一个回文数。所有的单位数都是回文数。

Although palindromic numbers are most often considered in the decimal system, the concept of palindromicity can be applied to the natural numbers in any numeral system. Consider a number N>0 in base b≥2, where it is written in standard notation with k+1 digits a​i​​ as
虽然回文数最常被认为是十进制,回文性的概念可以应用于任何数字系统中的自然数。假设一个以b为基数≥2的数N>0,用标准符号表示,k+1个数字a i为
在这里插入图片描述

Here, as usual, 0≤a​i​​ <b for all i and a​k​​ is non-zero. Then N is palindromic if and only if a​i​​ =a​k−i
​​ for all i. Zero is written 0 in any base and is also palindromic by definition.
这里,和往常一样,0≤a i <b对于所有i和k都是非零的。那么N是回文的当且仅当i = k−i
对于所有i, 0在任何底数下都写成0,而且根据定义,它也是回文的。

Given any positive decimal integer N and a base b, you are supposed to tell if N is a palindromic number in base b.
给定任何正的十进制整数N和以b为基数,你应该告诉N是否是以b为基数的回文数。

Input Specification:
Each input file contains one test case. Each case consists of two positive numbers N and b, where 0<N≤10的​9次方​ is the decimal number and 2≤b≤10的​9次方​ is the base. The numbers are separated by a space.
每个输入文件包含一个测试用例。每个案例包括两个正数N和b,其中0 < N≤10的9次方是十进制数和2 b≤≤10的9次方是基础。这些数字用空格隔开。

Output Specification:
For each test case, first print in one line Yes if N is a palindromic number in base b, or No if not. Then in the next line, print N as the number in base b in the form "a​k​ ak−1​​ … a0​ ". Notice that there must be no extra space at the end of output.
对于每个测试用例,如果N是以b为基数的回文数,则首先在一行中打印’ Yes ‘,否则打印’ No '。然后在下一行,打印出以b为基数的数字N,格式为“ak ak−1…”a0”。注意,在输出的末尾不能有多余的空格。

Sample Input 1:

27 2

Sample Output 1:

Yes
1 1 0 1 1

Sample Input 2:

121 5

Sample Output 2:

No
4 4 1

作者:CHEN, Yue
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB

解题思路:
首先将转换后的数的每一个组成部分用数组存储起来,遍历这个数组判断是否为回文数。
注意,转换后的数的每一部分不一定在[0-9],考虑2356 42 这个测试用例,答案应该是No 1 14 4。

代码:

def change(n, radix):
    if n == 0:
        return '0'
    result = []
    while n != 0:
        result.insert(0, str(n%radix))
        n = n // radix
    return result

if __name__ == '__main__':
    line = input().split(' ')
    n = int(line[0])
    radix = int(line[1])
    num = change(n, radix)
    result = ''
    if len(num) == 1:
        result = 'Yes' + '\n' + num[0]
    else:
        for x in range(len(num)//2):
            if num[x] != num[len(num)-1-x]:
                result = 'No' + '\n' + ' '.join(num)
                break
        if result == '':
            result = 'Yes' + '\n' + ' '.join(num)
    print(result)

提交记录:
在这里插入图片描述

回文树(Palindrome Tree),也称为字典树或自动机树,是一种用于高效查找字符串中所有子串是否为回文的方法的数据结构。在C++中,我们可以使用前缀树(Trie)为基础,对每个节点添加一个标记,表示其后缀是否为回文。 以下是一个简单的回文树实现步骤: 1. **定义节点**: 创建一个`Node`类,包含一个字符数组`children`用于存储子节点、一个布尔值`is_palindrome`标记当前节点及其所有后缀是否为回文,以及一个指向父节点的指针。 ```cpp class Node { public: char c; bool is_palindrome; Node* children[26]; // 26 for ASCII alphabet, adjust if needed Node(Node* parent); }; ``` 2. **构造函数**: 初始化字符和指向父节点的指针。 ```cpp Node::Node(Node* parent) : parent(parent), c('\0'), is_palindrome(false) { for (int i = 0; i < 26; ++i) children[i] = nullptr; } ``` 3. **插入操作**: 插入单词时,从根节点开始遍历,如果遇到某个字符不存在于子节点中,则新建一个子节点。同时,检查新插入的子串是否为回文。 ```cpp void insert(Node*& root, const string& word) { Node* node = &root; for (char c : word) { int idx = c - 'a'; // 根据ASCII调整 if (!node->children[idx]) { node->children[idx] = new Node(node); } node = node->children[idx]; if (word.size() > 1 && word[word.size() - 1] == c) { // 遍历过程中检查末尾是否成对出现 node->is_palindrome = true; } } } ``` 4. **查询操作**: 检查给定的子串是否在树中并返回所有回文后缀。 ```cpp vector<string> findPalindromes(Node* root, const string& prefix) { vector<string> result; dfs(root, prefix, result); return result; } void dfs(Node* node, const string& prefix, vector<string>& result) { if (!node) return; if (node->is_palindrome && !prefix.empty()) { result.push_back(prefix); } for (int i = 0; i < 26; ++i) { if (node->children[i]) dfs(node->children[i], prefix + node->c, result); } } ``` 5. **构建回文树**: 对输入的一系列单词进行插入,构建完整个树。 ```cpp Node* buildPalindromeTree(const vector<string>& words) { Node* root = new Node(nullptr); for (const auto& word : words) { insert(root, word); } return root; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vicky__3021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值