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 是对称数
相关推荐
星火开发设计几秒前
命名空间 namespace:解决命名冲突的利器
c语言·开发语言·c++·学习·算法·知识
Remember_99310 分钟前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
啟明起鸣15 分钟前
【Nginx 网关开发】上手 Nginx,简简单单启动一个静态 html 页面
运维·c语言·前端·nginx·html
卡里笔记19 分钟前
C语言版2048小游戏
c语言
梵刹古音34 分钟前
【C语言】 循环结构
c语言·开发语言·算法
皮皮哎哟42 分钟前
冒泡排序与数组传递全解析 一维二维指针数组及二级指针应用指南
c语言·算法·冒泡排序·二维数组·指针数组·传参·二级指针
蒸蒸yyyyzwd1 小时前
c网络编程学习笔记
c语言·网络·学习
烟花落o1 小时前
贪吃蛇及相关知识点讲解
c语言·前端·游戏开发·贪吃蛇·编程学习
头发还没掉光光1 小时前
Linux 高级 IO 深度解析:从 IO 本质到 epoll全面讲解
linux·服务器·c语言·c++
好好研究1 小时前
SpringBoot整合SpringMVC
xml·java·spring boot·后端·mvc