错题本
一.题目
输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no,不用考虑这个整型数过大,int类型存不下,不用考虑负值;
例如 12321是对称数,输出yes,124421是对称数,输出yes,1231不是对称数,输出no
二.正确答案
#include<stdio.h>
main()
{
int a, b,c,tmp;
scanf("%d", &a);
b = 0;
c = a;
while (a!=0)
{
tmp = a % 10;
b = b * 10 + tmp;
a = a / 10;
}
if (c==b)
{
printf("yes\n");
}
else {
printf("no\n");
}
return 0;
}
三.我当时是怎么错的
1.用几个词或者短句描述自己的思维过程
我的思考是:先算出输入的数字是几位数。然后利用相同数量的10去除以输入值,把输入的值拆分成1位数。之后思维就不知道干什么了
2.我有没有基础知识点、公式上的错误
对if()中3个表达式不太理解,while懂但写代码写不规范。
3.对照正确答案,我卡在哪一步了
b = b * 10 + tmp;
如何使对称的数字可以进行对比以确认相等
4.卡住的这一步是哪里出了问题
4.1陌生的解题技巧没见过
4.2已有的解题技巧没想到(模式识别)
1.为什么我没有做出来?
我绞尽脑汁也没想到怎么做到,之前想通过将数字字符串化来一个个索引对比等式,但不清楚C语言有没有Python相关的功能,最终放弃了。
2.我的方法为什么不行,哪一步走不下去了?
在取出输入值的不同位数后不知道如何把它们串联起来,想过组成字符串索引,但觉得应该有更简单的方法,但想不出来。
3.换个角度的话能不能利用现有条件做下去?
可以。我的答案和最终答案只差了关键部分,如果利用好取余数的特征是可以做出来的。
3.1如果不行的话是什么限制了它?
4.原答案是如何想到下面的思路的?我哪一步想差了?
- 原答案的原理是取余数一定会一个个从后往前地取出输入值的位数,因此对称数可以反其道而行之,将个位数变成最高位值,其它不同位数也相互替换,最终和保存的原输入值对比后相同,程序结束。
- 我没有想到余数的这一特征,而且对称数取余也具有迷惑性,我搞不清楚,余数是前面的还是后面的,也许如果我当时使用非对称数来输入,也许情况会不同。
4.1由哪个或者哪些条件导致了这个解题步骤的出现?
对称数