二、利用栈的数据结构判断回文:
我们知道栈的特性是先入后出,即先进入的元素后出,那么判断回文恰恰可以利用栈这一特性,将前面一般的元素入栈后,再依次出栈与后面一半的元素相比较,如果相同,那么就说明这串字符为回文字符。
代码如下:
int main() { int n = 0; scanf("%d", &n); int num = 0; //生成数字 for (num = 10000; num <= 999999; num++) { int tmp = num; int sum = 0; int count = 0; //计算位数之和 while (tmp) { sum += tmp % 10; tmp = tmp / 10; //统计位数 count++; } int flag = 1; //判断回文 SeqStack s; //将前一半字符入栈 for (i = 0; i < count / 2; i++) { Push(s, str[i]); } if (count % 2) // 若输入字符为奇数个时自动跳过中间的字符 i++; while (!EmptyStack(s)) { Pop(s, e); if (e!= str[i]) { flag = 0; break; } else i++; } //判断是否同时满足两个条件,并输出 if (sum == n && flag == 1) { printf("%d\n", num); } } return 0; }
三、直接反转数字:
直接反转数字的方法是一种很巧妙的方法,他的思想可以理解为取某个整数每一位的逆过程,我们知道想要的到某个整数的每一位只需要每次%10,再/10即可,那么直接反转数字的方法就是该过程的逆过程,代码实现也非常简单。
int main() { int n; int flag = 0; scanf("%d", &n); int num = 0; for (num = 10000; num <=999999; num++) { //创建临时变量tmp,循环中利用tmp进行操作,不会影响num的值 int tmp = num; int t = 0; int sum = 0; while (tmp) { //这里t计算得到的值就是该串字符反转后的值 t = t * 10 + tmp % 10; sum += tmp % 10; tmp /= 10; } if (t == num && sum == n) { flag = 1; printf("%d\n", num); } } return 0; }
这个代码最重要的思想就是 t = t * 10 + tmp % 10;
掌握后在进行回文判断上十分简单,并且这种方式的时间复杂度与空间复杂度相较前两种方式都有了显著提高。