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 是对称数
相关推荐
_周游2 小时前
【C语言】_指针与数组
c语言·开发语言
追逐时光者3 小时前
.NET集成IdGenerator生成分布式ID
后端·.net
SyntaxSage3 小时前
Scala语言的数据库交互
开发语言·后端·golang
码力全開3 小时前
C 语言奇幻之旅 - 第14篇:C 语言高级主题
服务器·c语言·开发语言·人工智能·算法
矮油0_o3 小时前
30天开发操作系统 第 12 天 -- 定时器
c语言·汇编·算法·操作系统
Dolphin_Home3 小时前
Spring Boot 多环境配置与切换
java·spring boot·后端
samson_www3 小时前
Azure主机windows2008就地升级十步
后端·python·flask
Adolf_19933 小时前
Django的runserver
后端·python·django
我本是机械人4 小时前
MVCC实现原理及其作用
java·数据结构·数据库·后端·mysql·算法
Pandaconda4 小时前
【Golang 面试题】每日 3 题(二十二)
开发语言·笔记·后端·面试·golang·go·channel