一、问题分析:
实现对称数的判断,其本质是实现对数组元素的逆序排放 :
如果整数为对称数,则其反转前后数字的顺序不发生改变 ,即:具有"对称性 "
如: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 是对称数