回文数就是对称的数字,如:121,4554。
题目是,输入一个数字n,输出5位或6位整数每一位相加等于n的整数。没有的话就输出-1。
整体思路
int main() {
bool f = false;
scanf("%d", &n);
for (int i = 10000; i < 1000000; i++) { //从5位数开始枚举
if ( judge(i)) { //这里判断是否是回文数。
printf("%d ", i);
f = true;
}
}
if (!f) {
printf("-1");
}
return 0;
}
怎么判断回文数
上述代码中的judge函数。
judge思路:可以把该整数的每一位以都存到一个数组中,然后来一位一位判断。这里我写了let[6](根据题目设立的,可以开更多的。)
int let[6];
bool judge(int x) {
int m = 0, sum = 0;
while (x) {
let[m++] = x % 10; //将每一位存到一个数组中
sum += x % 10;
x /= 10;
}
if (sum != n) { //如果位数之和不等于n就直接pass
return false;
}
for (int i = 0; i < m / 2; i++) { //一位一位判断
if (let[i] != let[m - 1 - i]) {
return false;
}
}
return true;
}
n=48:答案是
思考
一位一位判断是可不可以在相等时就返回 true,如下述代码:
int let[6];
bool judge(int x) {
int m = 0, sum = 0;
while (x) {
let[m++] = x % 10;
sum += x % 10;
x /= 10;
}
if (sum != n) {
return false;
}
for (int i = 0; i < m / 2; i++) { //这里不同
if (let[i] == let[m - 1 - i]) { //前面是相等时就返回
return true;
}
}
return false;
}
这个是完全错误的,这里我输入n=48:答案是
可以看到答案完全不同:第一个是399999,正常应该是699996。
为什么
第一个let[6] = {3,9,9,9,9,9}。let[0] != let[5](3 != 9)不会返回,但是当let[1] == let[4](9 == 9),就会直接返回true,导致下来判断错误。这里要注意。