人生伟业的建立,不在能知,乃在能行。
回文数:设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
在做逆序输出以及判断回文数题目之前,先做下这道题,如何计算用户输入的数是几位数呢?
思路:假设用户输入的数据是四位数1234
。
我们知道,1234%10=4
,我们就取到了用户输入数值中末位数字4
这个数字,这时候我们就知道用户输入的数至少是个位数
了(废话)。
我们还知道,1234/10=123
,我们可以利用他把用户输入的数值更新,更新之后,猜到没,我们再继续走步骤一,如果走得动,我们又知道用户输入的数值至少是两位数
了。
就这样再更新成12
,取得末位数字2
,我们就知道用户输入数值至少为三位数
了,再更新成1
,取得末位数字1
,我们就知道用户输入的数值至少为四位数
了这时候1/10=0
,完犊子,更新不了了,停止,我们就知道用户输入的数值,最终是四位数
。
具体代码如下:
#include
int main(void)
{
int number = 0; //用来存放用户输入的数值
int count = 0;//用来记录我们猜测的数值位数。
printf("请输入一个数,我来判断你输入的是几位数:\n");
scanf("%d", &number);
while (number != 0)//当number/10等于0时
{
number = number / 10;//更新number
count++;//先更新在记录,先记录在更新的话记录的是前一次数值的位数。
}
printf("您所输入的数是%d位数", count);
return 0;
}
请输入一个数,我来判断你输入的是几位数:
56654523
您所输入的数是8位数
做完上一题之后,再看下如何逆序输出,比如1234
逆序输出为4321
我们同样还是知道1234%10==4,
1234/10=123
对吧,所以没问题,按照上一题的逻辑,我们取得用户输入数值的末位数字之后对数值进行更新再取末位数字。就可以陆续得到1
,2
,3
,4
这四个数字了。
那么下面我们要思考的就是逆序输出后的数值和这几个数字的关系,我们可以发现1234=1X10X10X10+2X10+10+3X10+4。
当我们第一次取得数字1
的时候我们可以得到0X10+1=1
——>当我们继续取数字取到2
的时候,我们可以推演到,2X10+1=21
——>当我们继续取数字取到3
的时候,我们可以推演到3X10X10X10+12=321
——>同理继续取到数字4
,推演到4X10X10X10+321=4321
——>继续取数字,1/10=0
,取数字条件不成立,无法取到数字了,所以我们就得到了最终的结果4321
。
逆序输出后的数值处后的数值和这几个数字的关系需要用循环来实现,那么循环几次呢,循环什么时候终止呢?
由上面的推演我们知道循环了4次,也就是循环了数值的总位数次,所以思路一我们可以先计算用户输入数值的位数,然后再用控制循环次数,最后逆序输出。代码如下:
#include
int main(void)
{
int number = 0;//用户输入数据
int count = 0;//储存个数
int i = 0;//控制循环
int n_number = 0;//存放逆序输入数值
int last_number = 0;//存放末位数字
int flag = 0;//因为操作多次操作了number,每次操作前要将number的值初始化成用户输入的值。
printf("请输入一个数:\n");
scanf("%d", &number);
flag = number;//将number的值赋值给flag,以方便后续初始化。
number = flag;//第一次使用number来计算用户输入数值的位数
while (number!= 0)
{
number = number / 10;
count++;
}
number = flag;//第二次使用number进行逆序
for (i = 0; i < count; i++)
{
last_number = number % 10;//取数的最后一位
n_number = n_number * 10 + last_number;
//反转后的数的规律;0+1-->2*10+1-->+3*10*10+2*10+1-->4*10*10*10+3*10*10+2*10+1
number = number / 10;
//更新number的值
}
number = flag;//第三次用number,输出原始值。
printf("%d逆序输出为%d", number, n_number);
return 0;
}
请输入一个数:
1234
1234逆序输出为4321
上面的思路简单明了,但是略显笨拙,还要先计算用户输入数值的位数,那么我们直接判断终止条件可不可以呢,当然可以,我们发现循环的终止条件就是number/10=0,number不能再更新了,这时候循环终止。代码如下:
#include
int main(void)
{
int number = 0;//用来存放用户输入数值
int n_number = 0;//用来存放逆序数值
int last_number = 0;//用来存放获取的末位数字
int flag = 0;//用来初始化
printf("请输入一个数:\n");
scanf("%d", &number);
flag = number;//将number赋值给flag方便初始化
number = flag;
while (number != 0)
{
//此处的循环算法不解释了,上面有推演。
last_number = number % 10;
n_number = n_number * 10 + last_number;
number = number / 10;
}
number = flag;
printf("%d逆序输出为%d", number, n_number);
return 0;
}
请输入一个数:
12345
12345逆序输出为54321
上面两题都会做之后,判断回文数就很简单了,回文数的判断不就是判断原数据和逆序输出的数数值是否相等吗。最后加一个if语句判断就可以了。代码如下:
//代码1
#include
int main(void)
{
int number = 0;
int count = 0;
//number和count用来计算用户输入的数值的位数。
int i = 0;//控制循环
int n_number = 0;//存放逆序输出数值
int last_number = 0;//存放末位数字
int flag = 0;//因为操作了两次number,所以每次操作number要将number的值初始化成用户输入的值。所以用了两个flag变量,单独行事
printf("请输入一个数:\n");
scanf("%d", &number);
flag = number;//将number的值赋值给flag,以方便后续初始化。
number = flag;//第一次使用number来计算用户输入数值的位数
while (number!= 0)
{
number = number / 10;
count++;
}
number = flag;//第二次使用number进行逆序算法
for (i = 0; i < count; i++)
{
last_number = number % 10;//取数的最后一位
n_number = n_number * 10 + last_number;
//反转后的数的规律;0+1-->2*10+1-->+3*10*10+2*10+1-->4*10*10*10+3*10*10+2*10+1
number = number / 10;
//更新number的值
}
number = flag;//第三次用number,判断正逆是否相等
if (n_number == number)
{
printf("您输入的数是回文数。\n");
}
elseC
{
printf("您输入的数不是回文数。\n");
}
return 0;
}
//代码2
#include
int main(void)
{
int number = 0;
int n_number = 0;
int last_number = 0;
int flag = 0;
printf("请输入一个数:\n");
scanf("%d", &number);
flag = number;
number = flag;
while (number != 0)
{
last_number = number % 10;
n_number = n_number * 10 + last_number;
number = number / 10;
}
number = flag;
if (n_number == number)
{
printf("您输入的数是回文数。\n");
}
else
{
printf("您输入的数不是回文数。\n");
}
return 0;
}
请输入一个数:
1234321
您输入的数是回文数。
今天刚好练习的时候做到了这道题,就对这道题的解法做了一些笔记,应该没有问题,如有错误,还请各位大佬批评指正。