洛谷 P1015 [NOIP1999 普及组] 回文数【python】

文章讲述了作者在洛谷平台使用Python解题的经历,重点在于处理回文数的判断和不同进制加法的过程。作者提到了读入数据时需要注意的回车问题,以及如何判断回文数和实现任意进制的加法。代码示例展示了具体的解决方案。

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

题目链接
浅浅的记录我的洛谷python刷题情况



问题重述

题目描述

在这里插入图片描述

输入格式

在这里插入图片描述

输出格式

在这里插入图片描述

输入输出样例

#样例1
输入:
10
87
输出:
STEP=4

大概思路

这题很简单,就是有一个很大的坑,就是读入的数据会有一个回车,如果没有处理掉的话就会RE,这个坑让我花了将近2个小时,贼难受

首先我们就是要知道怎么判断回文数,判断回文数的方法有很多,python更简单,利用字符串即可

再就是进制的相加,十进制的相加我们熟悉吧,任意进制相加的原理都是一样的,所以我们就依葫芦画瓢就行了,我们可以在纸上随便编个8进制或者16进制或则2进制的任意两个数的加法,然后自己试着加一下就能懂了,接下来直接上代码


完整AC代码

def is_huiwen(number):
    return number == number[::-1]


def add(number, n):
    if n == 10:
        return str(int(number) + int(number[::-1]))
    c = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', "A", "B", "C", "D", "E", "F"]
    e = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
    d = dict(zip(c, e))
    a = number
    tag = 0             # 进位
    s = ""
    for i in range(len(a)):
        # 对应的位相加
        if tag:
            t = d[a[i]] + d[a[len(a) - i - 1]] + tag
        else:
            t = d[a[i]] + d[a[len(a) - i - 1]]
        if t >= n:
            tag = t // n
            s = c[t % n] + s
        else:
            s = c[t] + s
            tag = 0
    if tag:
        s = c[tag] + s
    return s

def main():
    N = int(input())
    M = input().strip()
    step = 0
    while step <= 30:
        if is_huiwen(M):
            print(f"STEP={step}")
            break
        else:
            M = add(M, N)
        step += 1
    else:
        print("Impossible!")

if __name__ == "__main__":
    main()
### NOIP 1999 普及组 回文数 题目解析 #### 高精度处理的重要性 对于NOIP 1999普及组中的回文数问题,由于给定的数值\( m \)可能达到一百位以内,因此传统的整型变量无法满足存储需求。为了应对这一挑战,可以采用数组来表示大数[^2]。 #### 数字反转与相加逻辑 解决问题的核心在于将原始数字转换成数组形式,并构建其反向版本。通过逐位对比原数组与其逆序后的副本,能够有效地判断该数是否为回文结构。当两个方向上的对应位置不匹配时,则需执行特定操作使二者趋于一致[^3]。 #### 进制转换考量 尽管题目描述涉及不同进制下的运算(如二至十以及十六进制),但实际上无论何种进制下,基本算法框架保持不变——即创建用于保存正序和倒序数据序列的一维数组`m1[]` 和 `m2[]` ,并依据当前所选基数完成相应的加法规则调整。 ```cpp #include <iostream> using namespace std; void solve(int base){ int num[105], revNum[105]; cin >> num; // Reverse the number and store it in revNum[] for (int i = 0; i <= top; ++i) revNum[i] = num[top-i]; bool isPalindrome = true; for (int i = 0; i <= top && isPalindrome ;++i) if(num[i]!=revNum[i])isPalindrome=false; while (!isPalindrome ) { // Add original array with reversed one considering carry over based on 'base' ... // Check again after addition whether new sum forms a palindrome or not. ... } } ``` 上述代码片段展示了如何读取输入、生成对应的镜像数组并通过循环检测直到找到符合条件的结果为止的过程。需要注意的是,在实际编码过程中还需要考虑具体的细节实现,比如进位机制等[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值