[NOIP1999 普及组] 回文数

 [NOIP1999 普及组] 回文数

题目描述:

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个十进制数 56,将 56 加 65(即把 56 从右向左读),得到 121$是一个回文数。

又如:对于十进制数 87:

STEP1:87+78=165  
STEP2:165+561=726  
STEP3:726+627=1353   
STEP4:1353+3531=4884  

在这里的一步是指进行了一次 N$进制的加法,上例最少用了 4 步得到回文数 4884。

写一个程序,给定一个 N(2<=10或 N=16)进制数 M(100$位之内),求最少经过几步可以得到回文数。如果在 30$步以内(包含 30 步)不可能得到回文数,则输出 `Impossible!`。

输入格式:

两行,分别是 N,M。

输出格式:

如果能在 30$步以内得到回文数,输出格式形如 `STEP=ans`,其中 ans为最少得到回文数的步数。

否则输出 `Impossible!`。

样例 :

样例输入 #1
10
87

样例输出 #1
STEP=4

思路:

   此题是一个多简单算法运用的题目,相当于求高精回文数。

因为:

既然是N进制数。

请把高精加中的——%10改为%n。

请把高精加中的——/10改为/n。

其他运算方式不变。

先定义变量:


                
### 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]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

龙星尘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值