回文数就是正序读和倒序读数字完全一样的整数,比如 121 1331 5 8,回文数求和的核心思路,就是先写一个判断函数,用来识别一个数字是不是回文数,再用循环遍历指定区间内所有整数,只要判定是回文数,就把它加到累加总和里面,最后输出总和。这个题型是 C 语言课程非常经典的综合题,同时考察数字反转判断回文,循环遍历,累加求和三个知识点。整体执行流程是定义回文判断函数,初始化累加变量为 0,循环逐个数字判断,满足条件就累加,循环结束输出最终求和结果。
一 解题原理
1 回文判断原理 把原数字反转得到新数字,如果反转后的数字和原数字相等,这个数字就是回文数
2 累加逻辑 设置 sum 初始值为 0,每找到一个回文数,执行 sum = sum + 当前数字
3 负数一般不参与回文求和,题目默认处理正整数
二 完整代码 求 1 到 n 之间所有回文数之和
include
// 判断是否是回文数,是返回1,不是返回0
int isPalindrome(int num)
{
int origin = num;
int reverse = 0;
// 数字反转
while(num > 0)
{
reverse = reverse 10 + num % 10;
num = num / 10;
}
if(reverse == origin)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int n;
int sum = 0;
printf("请输入上限n:");
scanf("%d",&n);
int i;
for(i = 1; i <= n; i++)
{
if(isPalindrome(i) == 1)
{
sum = sum + i;
}
}
printf("1到%d所有回文数总和为 %d\n",n,sum);
return 0;
}
三 代码逐段分析
isPalindrome 函数
origin 保存原始数字,因为后面 num 会在反转过程中被修改
reverse 初始为 0,while 循环每次取出个位 num%10,拼接到 reverse 末尾,num 除以 10 去掉个位
循环结束之后对比 reverse 和 origin,相等代表是回文数,返回 1,否则返回 0
main 函数
sum 初始化为 0,这个是累加必备初始化,不初始化会得到随机垃圾值
for 循环从 1 遍历到输入的 n
调用 isPalindrome 判断,如果返回 1,就把 i 加到 sum 里面
全部遍历完成之后打印总和
四 拓展版本 指定区间 a 到 b 之间回文数求和
修改 main 里面循环起点即可
for(i = a; i <= b; i++)
{
if(isPalindrome(i))
{
sum += i;
}
}
五 执行示例测试
输入 n=20
区间回文数是 1 2 3 4 5 6 7 8 9 11
总和 = 1+2+3+4+5+6+7+8+9+11 = 66
程序输出 1 到 20 所有回文数总和为 66
六 易错点清单
1 忘记初始化 sum 为 0,累加结果错误
2 反转数字的时候修改了原数字,没有提前保存 origin,后面对比出错
3 把 0 或者负数错误纳入判断逻辑
4 题目要求统计回文数个数和求和,两个变量不要混淆,count 用来计数,sum 用来求和
5 数字很大的时候 int 可能溢出,可以改成 long long 类型保存总和
【常见问题】
问题 1 C 语言回文数怎么求和里面,判断回文为什么要把数字反转
回答 1 C 语言回文数怎么求和的标准做法,就是反转数字之后和原数字对比,如果相等就是回文数,这是 C 语言回文数怎么求和最常用的实现方式。
问题 2 C 语言回文数怎么求和里面 sum 为什么必须初始化为 0
回答 1 C 语言回文数怎么求和里面 sum 是累加变量,如果不初始化,变量内存里面是随机值,累加之后结果错误,所以 C 语言回文数怎么求和代码必须写 sum=0。
问题 3 C 语言回文数怎么求和可以用字符串方式判断吗
回答 1 C 语言回文数怎么求和除了数字反转法,也可以转成字符串对比首尾字符判断回文,但是课程作业一般推荐数字反转写法,是 C 语言回文数怎么求和主流考点写法。
问题 4 C 语言回文数怎么求和如果数字总和很大 int 不够怎么办
回答 1 C 语言回文数怎么求和,当区间很大总和超过 int 上限会溢出,可以把 sum 定义成 long long 类型,输出格式改成 % lld,解决 C 语言回文数怎么求和的溢出问题。
【免责申明】
本文代码为课程作业参考实现,不同题目要求区间和数据类型可能不同,提交前请对照题目要求修改,仅用于学习参考,溢出边界问题请根据题目数据范围自行调整。


