P1015 [NOIP1999 普及组] 回文数

C语言 BC158 [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≤N≤10 或 N=16)进制数 M(100 位之内),求最少经过几步可以得到回文数。如果在 30 步以内(包含 30 步)不可能得到回文数,则输出 Impossible!。

输入格式

两行,分别是 N,M

输出格式

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

否则输出 Impossible!。

输入输出样例:

输入:10 87 输出:STEP=4

这道题有意思

解题思路:

其实思路倒是容易想到,就是加一次,判断是否是回文,是就不加直接跳出,不是就把次数加一然后继续加,再判断....

这道题的难点一在于高精度,m是一百位之内的数,那么常规解法肯定是不行了,要么用数组,要么用字符串了,个人做这种题比较喜欢用数组,因为用数组不用去写-48或者-‘0’。

难点二就是进制转换,有些同学看到这就蒙了,心想还要写个函数来进行进制转换,进制转换之后回文相加又不知道怎么加了,写是写的出来,但是往往把自己脑子搞乱了都还没写出来,这个的解法就是,不转换,直接把/10和%10改成/n和%n就行了,这个不难,自己领悟。

还有一点细节在代码里说明

#include<iostream>
#include<string>
using namespace std;
int i,o,p,u,y,t,ci=1,n,a,d,b;//ci表示次数,其他都是辅助作用
int m[205];//其实130位顶够,不过保险就开在205位
void add(int m[]);
bool huiwen(int m[]);
void exchange(int m[]);

void add(int m[])
{
	for (u = 199; u >= 1 && m[u] == 0; --u);
	b = u;
	if (u % 2 != 0) m[u / 2 + 1] += m[u / 2 + 1];
	for (t = 1; t <= b/2; ++t) { a = m[t] + m[u]; m[t] = a, m[u--] = a; }
	exchange(m);
	if (huiwen(m)) return;
	else {
		++ci;
		if (ci > 30) return;
		add(m);
	}
}

inline bool huiwen(int m[])//改成内联函数虽然空间消耗了点,但时间赚了,反正多次调用,下同。
{
	for (o = 199; o >= 1 && m[o] == 0; --o);//其实会用reverse函数的同学在这里可以
	                                        //更简单的写出来,我懒得用,反正差不多
	int flag = 1,w=o;
	for (p = 1; p <= w / 2; ++p) {
		if (m[p] != m[o--]) {
			flag = 0;
			break;
		}
	}
	if (flag) return true;
	return false;
}

inline void exchange(int m[])
{
	for (i = 1; i < 200; ++i) {
		if (m[i] >= n) {
			m[i + 1] += m[i] / n;//这里不要纠结把87这样过了就成78了,无所谓的,因为是回文
			m[i] %= n;
		}
	}
}

int main()
{
	string s;
	cin >> n >> s;//这里必须是字符串,不然写不进去100位数字
	if(n!=16) for (d = 0; d < s.size(); ++d) m[d+1] = s[d] - 48;
	else {
		for (d = 0; d < s.size(); ++d) {
			if (s[d] == 'A') m[d + 1] = 10;
			else if (s[d] == 'B') m[d + 1] = 11;
			else if (s[d] == 'C') m[d + 1] = 12;
			else if (s[d] == 'D') m[d + 1] = 13;
			else if (s[d] == 'E') m[d + 1] = 14;
			else if (s[d] == 'F') m[d + 1] = 15;
			else m[d + 1] = s[d] - 48;
		}
	}
	add(m);
	if (ci <= 30) cout << "STEP=" << ci << endl;
	else cout << "Impossible!" << endl;
	return 0;
}

C语言每日一题(24)回文素数题解 具体方法:从所输入的字符数组右往左提取每一个值,通过减去字符0的方法得到对应字符的整型,乘以它们对应位置的权值,权值的计算就是n在该位置的次方(pow(n,len-i-1))(可以去看看n进制于十进制之间转换的方法,加深理解),再将值累加到所定义的sum里面。思路就是将所得的值(sum)取模运算拿到每一位的值,对n进行求余整除(基于十进制转n进制的方法), 加上字符0完成整型到字符型的转换,放到字符数组里。例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。 阅读详情

相关推荐

【例1.6】回文数(Noip1999)

例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。写一个程序,给定一个N(2<N<=10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。第1行,给定一个N(2<N≤10或N=16)表示进制;第2行,一个N进制数M。

LBZ的博客 363

算法训练 回文数

问题描述   若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。   例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。   又如:对于10进制数87:   STEP1:87+78 = 165 STEP2:165+561 = 726   STEP3:726+627 = 1353 STEP4:1353+3531 = 4884   ...

ChanCherry的博客 1431

【题解-洛谷】P1015 [NOIP 1999 普及组] 回文数

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。位之内),求最少经过几步可以得到回文数。步以内得到回文数,输出格式形如。步)不可能得到回文数,则输出。在这里的一步是指进行了一次。进制的加法,上例最少用了。为最少得到回文数的步数。例如:给定一个十进制数。写一个程序,给定一个。

写代码的犄角旮瘩 1176

【洛谷】【高精度】【字符串】P1015 [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≤N≤10 或 N=16)进

要像蜗牛一样一步一步往上爬! 927

P1015 [NOIP1999 普及组] 回文数/1309:【例1.6】回文数(Noip1999)

没想到我也有求助的亿天 P1015 [NOIP1999 普及组] 回文数 提交76.36k 通过24.62k 时间限制1.00s 内存限制125.00MB 提交答案加入题单复制题目 做题计划(首页) 个人题单 团队题单 保存 选择团队 保存 题目提供者CCF_NOI 难度普及- 历史分数100 提交记录查看题解 标签 NOIp 普及组1999 查看算法标签 进入讨论版 相关讨论 查看讨论 推荐题目 查看推荐 洛谷推荐关闭 复制Markd...

Xiaorui_xuan的博客 499

Ghost备份还原Win10全攻略:从老电脑迁移到新硬盘,ESP分区处理是关键

本文详细介绍了使用Ghost工具将Win10系统从旧电脑迁移到新硬盘的全过程,特别强调了ESP分区的关键处理方法。通过分步指导备份、分区准备、系统还原和引导修复,帮助用户实现无缝系统迁移,解决常见问题如启动失败和驱动兼容性。

weixin_30823001的博客 672

【洛谷 P1015 NOIP 1999 普及组】 回文数

若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。例如:给定一个十进制数56,将56加65(即把56从右向左读),得到121是一个回文数。又如:对于十进制数8787781651655617267266271353135335314884在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。写一个程序,给定一个N2≤N≤10或N16)进制数M100位之内),求最少经过几步可以得到回文数。

Chow_Ssehc的博客 1146

Python自动化神器:OP插件64位版从安装到实战(附雷电模拟器截图技巧)

本文详细介绍了Python自动化神器OP插件64位版的安装与实战应用,包括环境搭建、窗口控制、鼠标键盘模拟等核心功能。特别针对雷电模拟器提供了最小化截图技术和OCR识别优化方案,帮助开发者高效实现Windows自动化任务。

weixin_29094539的博客 332

P1015 [NOIP1999 普及组] 回文数 题解

P1015 [NOIP1999 普及组] 回文数 题解

yaosichengalpha的博客 1152

STM32 ES8266上阿里云IOT MQTT实践【第七章】:ESP8266+MQTT上阿里云物联网平台实践

本篇文章讲述了如何使用stm32接入阿里云IOT,WiFi模块为ESP8266,可以实现发布以及订阅。

超级大洋葱的博客 2万+

InSAR图像配准:从像素级到亚像素级的精度提升策略

本文深入探讨了InSAR图像配准技术,从像素级到亚像素级的精度提升策略。通过分析最大频谱法和相干系数法的适用场景,结合频域补零插值和四叉树分块等高级技术,实现1/8像素级的高精度配准。文章还提供了实用的精度验证方法和常见问题排查指南,为InSAR数据处理提供全面解决方案。

nginx7reverse的博客 836

【题解】【洛谷P1015】【高精度】—— [NOIP1999 普及组] 回文数

蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。这里有个小技巧:我们不需要将字符存储起来,而是将其对应的数字存储起来,这样方便编写代码。若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

Pantheraonca的博客 997

国产大模型编程能力深度分析报告(2026年5月更新版)

2026年5月国产大模型编程能力报告显示,主流模型迎来重大升级。DeepSeek V4以1.6T参数创性能新高,Qwen3.6-Plus支持原生多模态编程,MiniMax M2.7转向闭源并优化Agent编码,Kimi K2.6成为商业化成熟的主力模型,GLM-5开源并涨价30%。阿里云百炼推出双轨订阅体系,区分团队和个人开发者需求。各模型在参数规模、上下文长度、性能表现和适用场景上各具优势,国产AI编程服务正加速向订阅制转型,成本效益显著提升。

Willin Wang 的全栈升级指南 1648

P1015 [NOIP 1999 普及组] 回文数

题目要求判断给定N进制数M经过若干次"反转相加"操作后能否在30步内变为回文数。解题关键在于将每位数字转为十进制处理,通过递归模拟相加和进位过程:每次操作将数字与其反转相加,处理进位后检查是否回文。若30步内未成功则输出"Impossible!"。代码使用字符转数值、数组存储数字,并递归处理进位和回文检查

2603_96485277的博客 156

细胞膜电学特性的分数阶微积分建模

分数阶微积分在细胞膜电学特性建模中的应用主要体现在对细胞膜的电容行为和神经元放电活动的更精确描述上。

冰河世纪20的博客 622

白话机器学习算法理论+实战番外篇之Xgboost

1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等 无监督算法:聚类,降维,关联规则, PageRank等 我前面已经尝试用最白话的语言完成了一个白话机器学习算法理论+实战系列,这个系列已经基本包含了上面这些算...

Miracle8070 1万+

每日c/c++题 备战蓝桥杯(洛谷P1015 [NOIP 1999 普及组] 回文数)

本题核心是掌握大数运算在模拟题中的应用关键点在于:正确实现进制转换高效处理大数加法与进位准确判断回文结构实际编程时需特别注意:数组越界问题(动态维护len变量)不同进制的字符处理(0-9和A-F)步骤计数器的初始值与终止条件进制转换的双向实现大数运算的基本技巧模拟算法的优化策略。

m0_74096349的博客 1189

【AI 编程工具】Codex配置部署指南

目录一、环境准备与基础安装1. 系统兼容性检查2. 前置依赖安装3. 安装方式选择二、API密钥配置与认证1. 获取API密钥2. 配置文件设置3. 临时配置方式三、沙盒环境配置与安全策略1. 沙盒模式选择2. 安全最佳实践四、高级功能配置1. 模型上下文协议(MCP)配置2. 模型版本切换3. 自定义网关配置五、常见问题排查1. 安装失败2. API调用失败3. 处理速度慢4. 配置文件不生效六、生产环境部署建议macOS/Linux:官方提供稳定支持,推荐使用原生环境Windows:官方标注为实验性支持

以实战经验介绍行业知识 2892

【题解·洛谷】P1015 [NOIP1999 普及组] 回文数

洛谷P1015 题解

qq_56897740的博客 1453

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: P1011 [NOIP1998 提高组] 车站
下一篇: 一元三次方程求解
Merran_
博客等级 码龄5年 10粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Merran_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值