C语言每日一题(24)回文素数题解

BC158 [NOIP1999]回文数

题目描述

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

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

又如:对于10进制数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>10时,使用大写'A'字母表示10,'B'表示11,...,'E'表示15

思路分析

本题是一道竞赛题,但实现思路比较简单,难就难在如何将它们联系在一起。

我们需要明确所需要实现的功能:

1.判断是否是回文数

2.如何实现n进制数的相加求和。

第一个功能,只需要将所给数存入数组,从左往右遍历,如果等于从右往左的值就是一个回文数。

其实也可以用求余运算判断,但这里考虑到16进制数,用一个字符数组存放会更加方便提取。

int is_hui(char* m, int sz)
{for (int i = 0; i < sz; i++){if (m[i] != m[sz - i - 1]) return 0;//逆向思维,只要有一个不等就不是回文数}return 1;
}

重点在于第二个功能。

我能想到的思路就是将所给n进制数转换为10进制后进行相加,再将和转换为n进制进行判断。 

1.n进制转10进制

具体方法:从所输入的字符数组右往左提取每一个值,通过减去字符0的方法得到对应字符的整型,乘以它们对应位置的权值,权值的计算就是n在该位置的次方(pow(n,len-i-1))(可以去看看n进制于十进制之间转换的方法,加深理解),再将值累加到所定义的sum里面。

特殊情况:

当n=10时,从左往右取每一个值与sum的10倍相加后再累加到sum里面。

当n=16同时该位置的值>=A,那就减去字符A再加上10即可取得对应的十进制数。

long long int todecrimal(char* m, int sz, int n)//题目要求,防止数据溢出,用ll类型
{long long int sum = 0;if (n == 10){for (int i = 0; i < sz; i++){int r = m[i] - '0';sum = sum * 10 + r;}}else{for (int j = sz - 1; j >= 0; j--){int r = 0;if (n == 16 && m[j] >= 'A'){r = m[j] - 'A' + 10;}else{r = m[j] - '0';}int tmp = r * pow(n, sz - j - 1);sum += tmp;}}return sum;
}

2.10进制转n进制

思路就是将所得的值(sum)取模运算拿到每一位的值,对n进行求余整除(基于十进制转n进制的方法), 加上字符0完成整型到字符型的转换,放到字符数组里。

完成后还得将字符逆序才是正确的结果。

如果n=16且余数>=10,则加上字符A-10才是字符结果。

void backdecrimal(char* m, long long int sum,int n) void类型,不需要返回值
{int i = 0;while (sum){if (n == 16 && (sum % n) >= 10){m[i] = (sum % n) + 'A' - 10;}else{m[i] = (sum % n) + '0';}sum /= n;记得整除i++;}int x = 0;int y = i - 1;while (x < y)交换,逆序存放。{char tmp = m[x];m[x] = m[y];m[y] = tmp;x++;y--;}}

 将上面两个函数整合一下,实现第二个功能

void addhui(int n, int sz, char* m)
{char mm[103] = { 0 };for (int i = 0; i < sz; i++){mm[i] = m[sz - i - 1];//先将m数组逆序存放到另外一个数组里,方便后面相加}long long int sum = todecrimal(m, sz, n) + todecrimal(mm, sz, n);正序加逆序backdecrimal(m, sum, n);转换为n进制数放到m里面
}

完整代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>int is_hui(char* m, int sz)
{for (int i = 0; i < sz; i++){if (m[i] != m[sz - i - 1]) return 0;}return 1;
}
long long int todecrimal(char* m, int sz, int n)
{long long int sum = 0;if (n == 10){for (int i = 0; i < sz; i++){int r = m[i] - '0';sum = sum * 10 + r;}}else{for (int j = sz - 1; j >= 0; j--){int r = 0;if (n == 16 && m[j] >= 'A'){r = m[j] - 'A' + 10;}else{r = m[j] - '0';}int tmp = r * pow(n, sz - j - 1);sum += tmp;}}return sum;
}
void backdecrimal(char* m, long long int sum,int n)
{int i = 0;while (sum){if (n == 16 && (sum % n) >= 10){m[i] = (sum % n) + 'A' - 10;}else{m[i] = (sum % n) + '0';}sum /= n;i++;}int x = 0;int y = i - 1;while (x < y){char tmp = m[x];m[x] = m[y];m[y] = tmp;x++;y--;}}void addhui(int n, int sz, char* m)
{char mm[103] = { 0 };for (int i = 0; i < sz; i++){mm[i] = m[sz - i - 1];}long long int sum = todecrimal(m, sz, n) + todecrimal(mm, sz, n);backdecrimal(m, sum, n);
}int main()
{int n = 0;char m[103] = { 0 };scanf("%d", &n);scanf("%s", m);int sz = strlen(m);int step = 0;while (sz = (int)strlen(m), is_hui(m, sz) == 0)//如果等于1跳出循环,计算step的值{step++;if (step >= 30) break;addhui(n, sz, m);}if (step < 30) printf("STEP=%d", step);else printf("Impossible!");return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/182807.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技创意赋能乡村文旅振兴

近日&#xff0c;由北京大学创意产业研究中心联合中国国际科技促进会新基建专委会共同主办的“科技创意赋能乡村振兴研讨会”在京举行&#xff0c;与会专家学者围绕“和美乡村共同富裕智慧文旅”主题进行深入探讨。北京大学创意产业研究中心副主任吕艺、国家文化和旅游公共服务…

【MongoDB】集群搭建实战 | 副本集 Replica-Set | 分片集群 Shard-Cluster | 安全认证

文章目录 MongoDB 集群架构副本集主节点选举原则搭建副本集主节点从节点仲裁节点 连接节点添加副本从节点添加仲裁者节点删除节点 副本集读写操作副本集中的方法 分片集群分片集群架构目标第一个副本集第二个副本集配置集初始化副本集路由集添加分片开启分片集合分片删除分片 安…

2023数学建模国赛C题赛后总结

今天国赛的成绩终于出来了&#xff0c;盼星星盼月亮的。之前面试的时候已经把我给推到国奖评委那里去了&#xff0c;可是好可惜&#xff0c;最终以很微小的劣势错失国二。只拿到了广西区的省一。我心里还是很遗憾的&#xff0c;我真的为此准备了很久&#xff0c;虽然当中也有着…

001、Nvidia Jetson Nano Developer KIT(b01)

之——镜像烧录 杂谈 Nvidia Jetson Nano Developer KIT&#xff08;b01&#xff0c;4G&#xff09;&#xff0c;系统配置全纪录&#xff0c;镜像烧录、系统安装、远程桌面安装、cuda与torch安装、pycharm、pycuda、tensorrt等等。 正文 1.开发板系统安装 1.1 开发板简介 Jet…

8、Python模块和包:导入模块、创建自己的模块和包

文章目录 Python模块和包:导入模块、创建自己的模块和包导入模块创建自己的模块创建包使用相对导入结论Python模块和包:导入模块、创建自己的模块和包 Python是一种功能强大的编程语言,它的模块和包系统是其强大功能的基石之一。在Python中,模块是包含Python定义和声明的文…

OpenSign 开源 PDF 电子签名解决方案

OpenSign 是一个开源文档电子签名解决方案&#xff0c;旨在为 DocuSign、PandaDoc、SignNow、Adobe Sign、Smartwaiver、SignRequest、HelloSign 和 Zoho Sign 等商业平台提供安全、可靠且免费的替代方案。 特性&#xff1a; 安全签名&#xff1a;利用最先进的加密算法来确保…

python df.apply()函数

DataFrame.apply(func, axis0, rawFalse, result_typeNone, args(), by_row‘compat’, kwargs) 沿df的轴应用函数 func:对每行或者每列应用的函数axis{0 or ‘index’, 1 or ‘columns’}, default 0 0是列&#xff0c;1是行 rawbool, default False result_type**{‘expand…

交货单过账/保存后增强点

增强点&#xff1a;交货单过账后的增强点->SE18->DELIVERY_PUBLISH 这个增强点是在VL02N修改/过账之后触发的 业务场景&#xff1a;需要在交货单过账之后自动开发票 sy-ucomm WABU_T "交货过账 "分子公司转采的单子需要同步开发票IF ( ( sy-tcode VL01N OR…

09 基变换

基变换 基本概念坐标转换詹妮弗坐标系→平面直角坐标系平面直角坐标系→詹妮弗坐标系转换对比基本原则 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 基本概念 对于右手平面直角坐标系&#xff0c;一般用 i ⃗ \vec{i} i 和 j ⃗ \vec{j} j ​表示其基向量。…

PyCharm 无法登陆 Codeium 的解决方法

PyCharm 登陆 Codeium PyCharm 无法登陆 Codeium 的问题描述PyCharm 使用 token 登陆 Codeium PyCharm 无法登陆 Codeium 的问题描述 使用 PyCharm 登录 Codeium 时&#xff0c;单击 Login 无反应&#xff0c;单击侧边栏的 Codeium 图标也一直显示连接失败。 PyCharm 使用 to…

AI:59-基于深度学习的行人重识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

微服务架构之路3,如何对微服务进行有效的监控?

目录 一、监控对象二、监控指标1、请求量2、响应时间3、错误率4、服务可用性5、资源使用率6、数据库访问量 三、监控维度1、全局维度2、分机房维度3、单机维度4、时间维度 四、监控系统原理1、数据采集2、数据传输3、数据处理4、数据展示 五、总结六、从零开始学架构&#xff1…

用自己的数据集训练YOLO-NAS目标检测器

YOLO-NAS 是 Deci 开发的一种新的最先进的目标检测模型。 在本指南中&#xff0c;我们将讨论什么是 YOLO-NAS 以及如何在自定义数据集上训练 YOLO-NAS 模型。 在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 -…

Ultra:知识图谱推理的基础模型

一、说明 训练单个通用模型来解决任意数据集始终是 ML 研究人员的梦想&#xff0c;尤其是在基础模型时代。虽然这些梦想已经在图像或自然语言等感知领域实现了&#xff0c;但它们是否可以在推理领域&#xff08;如图形&#xff09;中再现仍然是一个开放的挑战。 图片由作者根据…

力扣206. 反转链表

题目: 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#xff1a;…

微信小程序获取剪切板的内容到输入框中

xml代码 <navigation-bar title"Weixin" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view><input placeholder"请输入内容" name"content" type"text" …

.NET Framework中自带的泛型委托Action

Action<>是.NET Framework中自带的泛型委托&#xff0c;可以接收一个或多个输入参数&#xff0c;但不返回任何参数&#xff0c;可传递至多16种不同类型的参数类型。在Linq的一些方法上使用的比较多。 1、Action泛型委托 .NET Framework为我们提供了多达16个参数的Action…

【Linux】第十站:git和gdb的基本使用

文章目录 一、git的基本操作1.gitee新建仓库注意事项2.git的安装3.git的克隆4.git的add5.git的commit6.git的push7.git log8.git status9. .gitignore 二、Linux调试器---gdb1.背景2.gdb安装、进入与退出3.list/l4.r/run运行程序5. break/b 打断点6.info/i b 查看断点7.delete/…

Linux学习之vim跳转到特定行数

参考的博客&#xff1a;《Vim跳到最后一行的方法》 《oeasy教您玩转vim - 14 - # 行头行尾》 《Linux&#xff1a;vim 中跳到首行和最后一行》 想要跳到特定行的话&#xff0c;可以在命令模式和正常模式进行跳转。要是对于vim的四种模式不太熟的话&#xff0c;可以到博客《Linu…

SRC-用友 ERP-NC NCFindWeb 目录遍历漏洞

漏洞描述 用友ERP-NC 存在目录遍历漏洞&#xff0c;攻击者可以通过目录遍历获取敏感文件信息。 fofa&#xff1a; poc&#xff1a;/NCFindWeb?serviceIPreAlertConfigService&filename 在url处拼接poc后可以看到该站点的目录和文件 访问某个文件 /NCFindWeb?serviceIPre…