对于判断水仙花数的题目可以说是C语言题目中的经典题目了,今天咱还是给大家好好分析一下判断水仙花数的题目该怎么写,我想对于初次看到这种题的小伙伴们都会有以下两个问题:
- 水仙花数是什么?
- 这个循环该怎么写?
分析:
对于上面的问题,咱们需要解决的第一个问题是什么是水仙花数,其实我在学习C语言之后我也不知道,百度了才知道的,哈哈哈哈。百度上对于水仙花数的解释为:水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
水仙花数的规律:
它的每个位上的数字的 3次幂之和等于它本身,如(1*1*1)+(5*5*5)+(3*3*3)=153。
了解了什么是水仙花数,大家心里对于这题应该就有大致的解题思路了,咱们就只需要用一个for循环,将i的起始值设置为100,跳出条件设置为999,每判断一个数自增一,然后来依次对100-999里面的数值进行判断,满足条件就输出即可。想到这,大家就成功了一办,为什么说成功了一半了?规律知道了,循环也知道怎么写了,判断条件也知道怎么写了,但是怎样才能对里面的数值进行依次判断呢?
解题重点:
这就需要用到我们C语言里面的一个概念:取模
取模,也叫取余,也就是通过取余数的方法来达到从一个多位数中将每个位数的数值单独取出来进行相应的运算。
我们判断水仙花数的规律在上面也说到了,是一个三位数中每个位数值的3次幂之和为这个三位数,这个数值才叫水仙花数,所以这就需要我们用到取模的方法将每个三位数中的个位、十位、百位数值单独取出来,然后进行总和运算判断是否等于这个三位数值即可判断是否为水仙花数。
代码:
#include "stdio.h"
#include "windows.h"
int main(){
//先定义几个变量用来接收三位数的个位、十位、百位值
int i,b,c,d;
for(i=100;i<=999;++i){
//用变量b来接收三位数i中的个位数值
b = i % 10;
//用变量c来接收三位数i中的十位数值
c = i / 10 % 10;
//变量d来接收三位数中i的百位数值
d = i / 100;
//用if判断个十百位每个位数的立方和是否等于数值i本身
if((b*b*b)+(c*c*c)+(d*d*d)==i){
printf("%d为水仙花数\n",i);
}
}
system("pause");
}
运行结果:
判断用户自己输入的数值是否为水仙花数:
如果想通过用户自己输入的值来进行判断是否为水仙花数,只需要再定义一个变量作为循环条件,然后加入一个输入语句,将for循环中的初始条件和跳出条件的数值改变为你想连续输入的次数即可,代码如下:
代码:
#include "stdio.h"
#include "windows.h"
int main(){
//先定义几个变量用来接收三位数的个位、十位、百位值
int i,j,b,c,d;
//可以连续输入六次判断完成之后跳出循环
for(j=0;j<=5;++j){
printf("Input a Number:\n");
scanf("%d",&i);
b = i % 10;
//用变量c来接收三位数i中的十位数值
c = i / 10 % 10;
//变量d来接收三位数中i的百位数值
d = i / 100;
//用if判断个十百位每个位数的立方和是否等于数值i本身
if((b*b*b)+(c*c*c)+(d*d*d)==i){
printf("%d为水仙花数\n",i);
}else{
printf("%d不为水仙花数\n",i);
}
}
system("pause");
}
运行效果: