C语言学习-第二章:数据类型、运算符和表达式

一、问题分析:

实现对称数的判断,其本质是实现对数组元素的逆序排放 :

如果整数为对称数,则其反转前后数字的顺序不发生改变 ,即:具有"对称性 "

如:12321,逆序排放后还是:12321。
因此,要实现此功能,就要实现对整数序列的逆序排放(反转),并判断前后是否一致。

其核心逻辑是实现序列的反转(时间和空间复杂度的分析也经常会遇到类似的操作:O(n)级别)

那么,有哪些方法可以实现序列的反转呢?

我们在时间空间复杂度分析中,常见的就是使用数组 和循环遍历,正序取元素,倒序排放

我还没有掌握其具体实现的代码,下面参考gpt来学习一下:

对于实现逆序排放,gpt的建议是:使用"对10取余数 "的方法,实现原理如下:

对于一个整数,如123,我们对把它除以10,则:商12,余数为3,并且3就是其最后一位数字,然后我们取到3

然后把3存放到逆序数组reversed_num中,然后继续拿数组中的剩余元素除以10,则:商10,余2

然后继续拿num除以10,商10,余数为2,将其存入reversed_num中,继续拿数组中的剩余元素除以10,则:商0,余1

将其存入reversed_num中,实现逆序排放.其实上述过程就是我们进制转换中用的"除二取余法 " 这里将附上述实现的过程:

二、代码实现:

下面学习其具体实现:(这里顺便学习C语言中定义函数并调用的方法哈哈!)

c 复制代码
// 函数和变量一样,先定义(声明)后使用:  
// symmetric:对称的  
int is_symmetric_number(int num); // 对称性判断函数的参数是:int num: "一个整型的数组num"  
  
// 函数声明之后,进行程序的核心部分编码,即函数功能的实现部分:"判断是否是对称数":  
int is_symmetric_number(int num) // 格式:函数名{函数体(也即是函数的具体功能实现)}  
{  
// 定义我们要用的数组:数组定义和初始化(类似于变量的定义和初始化(初始化也就是赋值和分配空间!))  
  
// original:原始的:定义原始数组,即存放用户输入的未反转的数组:并初始化原始数组:"赋给 num"  
int original_num = num; // 保存原始的整数,用于最后的比较  
// 定义并初始化存放反转后元素的数组:  
int reversed_num = 0;  
  
// 定义数组长度digits[10]: 假设整数不超过10位  
int digits[10]; // 存储每一位数字,假设不超过10位  
// 初始化: 统计输入的整数个数  
int digits_count = 0; // 记录存储的整数个数  
  
// 存储用户输入的每一位数字:使用循环遍历数组,将整数除以10,并取余数  
// 由于不知道用户具体输入多少位整数,所以使用while循环,将遍历用户所有的输入:  
while(num > 0){  
  
// 使用定义的数组digits存储输入的整数对10取余的结果  
digits[digits_count] = num % 10; // 预取输入:123,存储余数:3 // 取得最后一位数字  
// 将用户输入的整数不断除以10  
num = num / 10; // 去掉最后一位数字  
// 每次除以10并存储余数后,整数个数自增1  
digits_count++; // 记录存储的数字数量  
}

过程模拟:

c 复制代码
// 至此,函数is_symmetric_number(int num)的功能部分已经编码完毕:即实现"除10并取余数"  
  
// 下面,我们就需要将取到的余数逆序排放:  
// 由于已经获取到用户输入具体整数个数,采用for循环遍历所有整数: 
for (int j = 0; j < digits_count; j++) {  
// 整个 for 循环的作用是逐个访问数组 digits 中的元素,从索引 0 开始,  
// 直到 digits_count - 1。在这个具体的例子中,循环的目的是将数组中的每一位数字加到 reversed_num 的末尾,以构建反转后的数组 
reversed_num = reversed_num * 10 + digits[j];  
// reversed_num * 10: 这部分是将 reversed_num 左移一位。在十进制中,左移一位相当于乘以10。  
  
// + digits[j]: 这部分是将数组 digits 中的第 j 位数字加到 reversed_num 的末尾。  
// 这里使用了数组索引 j 来访问数组中的特定元素。  
// 所以,整个表达式的作用是将数组 digits 中的每一位数字逐个加到 reversed_num 的末尾,  
// 从而构建出了反转后的整数。这样,循环遍历数组的过程中,reversed_num 不断地增大,最终得到的就是原始整数的反转形式。  
}  
// 反转完毕,返回比较的结果:  
return original_num == reversed_num;  
  
}  
// 编写主函数,调用并执行:  
int main() {  
// 输入整数  
int user_input;  
printf("请输入一个整数: ");  
scanf("%d", &user_input);  
  
// 判断是否是对称数  
if (is_symmetric_number(user_input)) {  
printf("%d 是对称数\n", user_input);  
} else {  
printf("%d 不是对称数\n", user_input);  
}  
  
return 0;  
}  
// 测试: 符合预期!  
//请输入一个整数: 12321  
//12321 是对称数
相关推荐
Navigator_Z10 分钟前
LeetCode //C - 1313. Decompress Run-Length Encoded List
c语言·算法·leetcode
程序员飞哥12 分钟前
AI 编程额度怎么用才不浪费?
java·前端·后端
二月夜13 分钟前
Redis 高频面试题全解:缓存三大问题、大 key 治理与分布式锁之争(2026 招聘 JD 真题复盘)
redis·分布式·后端·缓存
IT_陈寒29 分钟前
Vite开发实战:从入门到精通
前端·人工智能·后端
学长毕设34 分钟前
基于SpringBoot的文具商城在线零售系统-附源码
spring boot·后端·零售
乐橙开放平台1 小时前
离岗检测怎么实现?通过客流相机或 AI 摄像头识别岗位区域无人状态,再推送告警消息
人工智能·笔记·后端·数码相机·物联网·自动化·音视频
wuminyu9 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
ZhengEnCi10 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
王中阳Go10 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
程序猿DD10 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端