解题思路:
题前小叙:同样的,我被一处小失误,改了半个多小时的代码,就在回文数字判断那边失误的,竟然直接在参数上进行操作!!!切记需要和参数进行判断时,不能在参数上进行其他操作!!!
思路:由于这个范围比较小,可以用int存储,就没有使用字符串进行回文判断,而是直接在数字上进行操作的。这一题就是需要满足两个条件:1、回文数字 2、一个数的每位数字的和等于输入的数字;就是那么简单,只需要写一个回文判断函数,加一个判断每位数字的和是否与输入的数相等即可,接下来写一下具体步骤。
步骤: 1、使用for循环遍历10000-999999之间的数字
2、判断是否为回文数字(本题解采用的做法是,把每一位数字进行反转,判断是否相等)
3、判断一个数的每一位数字是否等于输入的数字
注意事项:
1、可以通过一些细节优化时间复杂度,比如可以被10整除的一定不是回文数(由于本题没有涉及到负数,就没有写判断负数)
2、进行回文数判断时,一定不能对原参数进行判断,要拷贝一份再进行操作,以防改变原参数的值,导致判断出错
3、
参考代码:
#include using namespace std; bool isPalindrome(int x)//回文数判断 { int copyx = x,reverse_x = 0;//拷贝一份x,避免对参数直接进行操作 while(copyx != 0)//利用while循环,是整个数字反转,其实还可以优化,不必反转整个数字,反转一半就行 { reverse_x = reverse_x * 10 + copyx % 10; copyx /= 10; } return x == reverse_x; } bool isequal(int x,int target)//判断数字的每一位数的和是否等于输入的数字 { int sum = 0; while(x)//得到每一位数的和 { sum += x % 10; x /= 10; } return sum == target; } int main() { int x,flag = 0;//定义一个旗帜,判断这个范围里面有没有符号条件的数 cin >> x; for(int i = 10000;i <= 999999;i++) { if(i % 10 != 0 && isPalindrome(i)&& isequal(i,x))//加上i % 10 != 0是为了优化时间复杂度,同时判断每一位数的和是否等于参数 { cout << i << endl; flag = 1; } } if(flag == 0)//如果没有,返回-1 cout << "-1" << endl; return 0; }
0.0分
4 人评分