news 2026/1/18 21:48:32

判断N进制的数字反转相加后是不是回文数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
判断N进制的数字反转相加后是不是回文数

(一).这里所说的回文数是一个数字从前向后和从后向前读是一样的,比如是进制的87,通过反转相加四步就可以得到回文数,如果超过一定的范围以后就输出不是回文数,这里需要讨论的是1~10进制和16进制的数字相加以后可不可以成为回文数

STEP1:87+78 = 165 STEP2:165+561 = 726

STEP3:726+627 = 1353 STEP4:1353+3531 = 4884

(二),该如果存储这个数据是一个头痛的事情,如果使用longlong的类型也就只能存放2的32次方,而且这里还需要有16进制的数字,16进制的数字有ABCDEF这样的字符,那这样用字符进行存储就顺其自然了,顺着这样想下去,存放在数组中的是字符,但是计算的时候需要用数字,那是不是需要两个函数,将字符转化为数字,还需要将数字转化为字符。接下来如果是需要原数据反转后的数组,是不是还需要设计一个函数将进行反转,反转完了以后是不是需要加到原来的数据上,是不是需要设计一个函数进行两个数组的相加,再接着想下去,需要判断是不是回文数,不能一直这样反转下去不判断什么时候进行判断 是不是回文数。总共的函数就是这些,基本思路就是这样。

1.字符转数字函数,当输入一个字符的时候这个字符如果是1-9中间的字符就将这个字符减去‘0’,这里对应的差值就是ASCII中的差值,也是这个字符对应的数字,字符’1减字符‘0差值就是1,也代表传进来的数字是转化的数字是1,当这个传进来的这个数字是16进制的时候可能就会出现字符ABCDEF这样的字符,这个时候就需要这个字符减去‘A’+10,其实和刚才是一样的,不过这里的基准是10,对比一下0-9转化的样子,假设在后面补个零 c-'0'+0,十六进制是这样的c-'A'+10,数字转字符也是一样的。

int char_to_int(char c) { if (c <= '9' && c >= '0')//如果是数字就转化为数字返回,将字符转化为数字 return c - '0'; return c - 'A' + 10;//这个里的c可能是大写字母ABCDEF是十六进制的字符,要想转为数字,先减A再加10, } char int_to_char(int n) { if (n <= 9 && n >= 0) return n + '0'; return n + 'A'-10; }

2.判断回文数和逆序字符串的思路是一样的,都是设置两个指针,一个指针表示最后面的字符,一个指针表示最前面的值,判断回文数,如果是回文数就返回1不是就返回0,大部分返回函数都应该这样设计,前面的指针向后面走,后面的指针想向前面走,如果碰到有个不一样的字符就不是回文数,直到right=left,逆序字符串也是一样,创建一个临时变量用来存储,没走一步就交换,直到right=left,这两个函数都是遍历字符串,只不过在遍历的过程中所需要做的操作不一样

int is_huiwen(char* str) { assert(str); int left = 0; int right = strlen(str)-1;//right代表数组下标 while (right > left) { if (str[right] != str[left]) return 0;//说明不相等 right--; left++; } return 1;//对比完了都相等 } void reverse(char* str) { assert(str); int left = 0; int right = strlen(str) - 1;//代表数组下标 while(right > left) { char temp =str[right]; str[right] = str[left]; str[left] = temp; left++; right--; } }

3.这个函数是这个回文数算法中最重要的函数,这个函数的思路是这样,传入四个参数,反转后的数组,原数组,存放结果的数组,传进来需要进行几位进制的数组。参数明白了以后,需要计算反转数组的长度为什么不用计算原来数组的长度?因为这里的反转数组就是原来的数组反转得到的,所以两个数组的长度是一样的,设置一个变量用来记录目标数组的下标,设置一个sum用来记录需要进位的值,计算两个数一定是从低位开始进行计算,刚开始时候sum=0;jin=0;开始循环,将原数组最后一个元素加到sum上,将反转后的数组也加到sum上,这个时候数组中的元素是字符,需要转化为数字进行计算,你可以想一下,再进行十进制计算的步骤,这个时候jin=sum/N,假设这里的sum=8+9=17,我们要进行10进制计算,进位是不是就是等于1,17/10.保留整数位就是1,接下来应该将数据存放在数组中存放的时候应该将整数取模再放进去,转化为字符,可以类比十进制,这里存放的是原数组和反转数组的最后一位,但是放在了目标数组的第一位,所以结束后应该反转,当计算到最后一位的时候还应该考虑要不要进位,所以进入循环有两个条件,一个是数组的最大值,另一个就是进位是不为真(需要进位),当进行完了以后这个数组里面最后一个数据可不是‘\0’,需要手动添加

void Add_reverseM_M(char* reverseM, char* M, char* result, int N)//反转的数组,要判断的数组,结果数组,进制 { assert(reverseM && M); int jin = 0; int respos = 0; int len_reverseM = strlen(reverseM); int len_M = strlen(M); int max_len = len_M > len_reverseM ? len_M : len_reverseM; for (int i = 0; i < max_len || jin; i++)//i从零开始,i<最大的值,或者有需要进位的,i++ { int sum = jin;//sum记录进位 if (i < len_M) sum += char_to_int(M[len_M - 1 - i]);//这个地方是通用写法,不仅可以计算长度相同,也可不同 if (i < len_reverseM)sum += char_to_int(reverseM[len_reverseM - 1 - i]); jin = sum / N;//看是否需要进位,如果sum=19,计算的是10进制那么这里jin就是1 result[respos++] = int_to_char(sum % N);//将得到的结果放到N中 } result[respos] = '\0';//最后末尾位置要放\0 }

数组相同的代码

void Add_reverseM_M(char* reverseM, char* M, char* result, int N)//反转的数组,要判断的数组,结果数组,进制 { assert(reverseM && M); int jin = 0; int respos = 0; int len_M = strlen(M); for (int i = 0; i < len_M || jin; i++)//i从零开始,i<最大的值,或者有需要进位的,i++ { int sum = jin;//sum记录进位 if(i<len_M) { sum += char_to_int(M[len_M - 1 - i]); sum += char_to_int(reverseM[len_M - 1 - i]); } jin = sum / N;//看是否需要进位,如果sum=19,计算的是10进制那么这里jin就是1 result[respos++] = int_to_char(sum % N);//将得到的结果放到N中 } result[respos] = '\0';//最后末尾位置要放\0 }

(三).写代码的时候一定先捋清楚思路再写,否则将花费大量的时间去修改

#define _CRT_SECURE_NO_WARNINGS //判断n进制的数字是不是不是回文数,从前面向后面读都是一样的,看第几次相加后得到是 //必须是在30步以内,如果超过了这个步数,就不是回文数 //用数组进行存放 #include<stdio.h> #include<string.h> #include<assert.h> int is_huiwen(char* str) { assert(str); int left = 0; int right = strlen(str)-1;//right代表数组下标 while (right > left) { if (str[right] != str[left]) return 0;//说明不相等 right--; left++; } return 1;//对比完了都相等 } void reverse(char* str) { assert(str); int left = 0; int right = strlen(str) - 1;//代表数组下标 while(right > left) { char temp =str[right]; str[right] = str[left]; str[left] = temp; left++; right--; } } int char_to_int(char c) { if (c <= '9' && c >= '0')//如果是数字就转化为数字返回,将字符转化为数字 return c - '0'; return c - 'A' + 10;//这个里的c可能是大写字母ABCDEF是十六进制的字符,要想转为数字,先减A再加10, } char int_to_char(int n) { if (n <= 9 && n >= 0) return n + '0'; return n + 'A'-10; } void Add_reverseM_M(char* reverseM, char* M, char* result, int N)//反转的数组,要判断的数组,结果数组,进制 { assert(reverseM && M); int jin = 0; int respos = 0; int len_reverseM = strlen(reverseM); int len_M = strlen(M); int max_len = len_M > len_reverseM ? len_M : len_reverseM; for (int i = 0; i < max_len || jin; i++)//i从零开始,i<最大的值,或者有需要进位的,i++ { int sum = jin;//sum记录进位 if (i < len_M) sum += char_to_int(M[len_M - 1 - i]);//这个地方是通用写法,不仅可以计算长度相同,也可不同 if (i < len_reverseM)sum += char_to_int(reverseM[len_reverseM - 1 - i]); jin = sum / N;//看是否需要进位,如果sum=19,计算的是10进制那么这里jin就是1 result[respos++] = int_to_char(sum % N);//将得到的结果放到N中 } result[respos] = '\0';//最后末尾位置要放\0 } int main() { char M[1000] = {0};//养成初始化是个好的习惯 int N = 0; scanf("%d", &N);//N是进制 scanf("%s", M); char result[1000] = { 0 }; char reverseM[1000] = { 0 }; int step=0; while (step<=30) { if (is_huiwen(M))// { printf("STEP=%d", step); return 0; } strcpy(reverseM, M);//将要反转的数组放到reverse中,保留原先的数组 reverse(reverseM);//反转数据 Add_reverseM_M(reverseM, M, result,N);//将reverseM和M中的数据加到result中 reverse(result);//相加以后这里的结果是相反的 strcpy(M, result);//将结果放到M中进行下一轮循环 step++; } return 0; }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/17 11:43:10

探索商用车 P2 并联混合动力控制器功能规范与 HCU 控制策略

商用车整车主机厂产品级P2并联混合动力控制器功能规范&#xff0c;HCU控制策略&#xff0c;可以对照直接搭模型在商用车领域&#xff0c;随着环保要求的日益严格和能源效率提升的需求&#xff0c;混合动力技术逐渐成为焦点。今天咱们就来深入聊聊商用车整车主机厂产品级 P2 并联…

作者头像 李华
网站建设 2026/1/14 5:39:42

NVIDIA TensorRT在智能制造中的潜在应用

NVIDIA TensorRT在智能制造中的潜在应用 在现代电子制造车间的一条高速SMT&#xff08;表面贴装技术&#xff09;生产线上&#xff0c;每分钟有超过4000块PCB板通过视觉检测工位。摄像头以60帧/秒的速度捕捉图像&#xff0c;AI系统需要在8毫秒内完成缺陷识别并触发剔除动作——…

作者头像 李华
网站建设 2026/1/16 4:14:18

TensorRT推理日志分析与故障排查指南

TensorRT推理日志分析与故障排查指南 在现代AI系统部署中&#xff0c;一个训练好的模型从实验室走向生产环境&#xff0c;往往面临“跑得动”和“跑得好”的巨大鸿沟。尤其是在视频监控、自动驾驶或实时推荐这类对延迟极其敏感的场景下&#xff0c;哪怕几毫秒的延迟波动都可能…

作者头像 李华
网站建设 2026/1/17 19:55:12

从训练到推理:TensorRT如何填补最后一公里?

从训练到推理&#xff1a;TensorRT如何填补最后一公里&#xff1f; 在AI模型越来越强大的今天&#xff0c;一个耐人寻味的现象却普遍存在&#xff1a;实验室里的模型准确率节节攀升&#xff0c;但在真实生产环境中部署时&#xff0c;却常常“跑不动”——响应慢、吞吐低、成本高…

作者头像 李华
网站建设 2026/1/14 6:30:20

视觉Transformer模型的TensorRT优化之路

视觉Transformer模型的TensorRT优化之路 在AI推理性能日益成为系统瓶颈的今天&#xff0c;视觉Transformer&#xff08;ViT&#xff09;这类前沿模型虽然在准确率上屡创新高&#xff0c;却常常因“跑得太慢”而被挡在生产环境门外。尤其是在智能安防、自动驾驶和工业质检等对延…

作者头像 李华
网站建设 2026/1/17 12:10:01

LLMs之MCP:用代码调用 MCP(MCP + Code Execution)—用执行环境让 AI 代理更高效(用代码执行解决 MCP 的上下文成本问题)—减少 token、提升隐私与可复用性的实战

LLMs之MCP&#xff1a;用代码调用 MCP(MCP Code Execution)—用执行环境让 AI 代理更高效(用代码执行解决 MCP 的上下文成本问题)—减少 token、提升隐私与可复用性的实战方案(用执行环境和技能库扩展 MCP 代理能力) 导读&#xff1a;Anthropic 介绍了把 MCP&#xff08;Model…

作者头像 李华