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 是对称数
相关推荐
十年老菜鸟1 分钟前
spring boot源码和lib分开打包
spring boot·后端·maven
白宇横流学长35 分钟前
基于SpringBoot实现的课程答疑系统设计与实现【源码+文档】
java·spring boot·后端
加瓦点灯1 小时前
什么?工作五年还不了解SafePoint?
后端
他日若遂凌云志2 小时前
Lua 模块系统的前世今生:从 module () 到 local _M 的迭代
后端
David爱编程2 小时前
Docker 安全全揭秘:防逃逸、防漏洞、防越权,一篇学会容器防御!
后端·docker·容器
SY师弟2 小时前
台湾TEMI协会竞赛——1、龙舟机器人组装教学
c语言·单片机·嵌入式硬件·机器人·嵌入式·台湾temi协会
小码编匠2 小时前
WinForm 工业自动化上位机通用框架:注册登录及主界面切换实现
后端·c#·.net
weixin_483745622 小时前
Springboot项目的目录结构
java·后端
阿里云云原生2 小时前
2025年第二届“兴智杯”智能编码创新应用开发挑战赛正式启动
后端
学习噢学个屁2 小时前
基于STM32音频频谱分析设计
c语言·stm32·单片机·嵌入式硬件·音视频