水仙花数”:是指一个三位数,其各位数字的立方和等于该数本身数值。
例如:原数 : abc
个位数: c, 十位数:b ,百位数: a
则水仙花数的要求:abc = a 3 a^3 a3 + b 3 b^3 b3 + c 3 c^3 c3; 满足这样条件的数均为水仙花数,不满足的则不是水仙花数。
思路:
要求水仙花数,首先就要知道其范围要求:三位数,则范围是[100, 999];
另外,需要满足表达式,那么我们就需要求出其对应的个位数,十位数,百位数。
怎么去求得各对应位数呢?假设申请变量 a , b , c 分别代表百十个位,获取一个数,假设为 N。
对于求数存在多种表达方式,现在介绍一种较为容易理解的方法
首先:怎么获取百位呢? 整数 N / 100 本应该带小数,但类型属于 int 型,强制转换为整数,则 百位 a = N /100;(451/100=4)
其次:怎么求十位呢?将三位数除以10并强转,将小数位(原数的个位数)去掉,现在数据的个位便是原数的十位,二位数再取10的余,得到的余数便是原数的十位。表达方式:b = N /10%10;(451/10=45;45%10=5)
然后:怎么求个位呢?在求十位中应该有所发现,求余可以得到。表达式:c = N %10;(451%10=1)
最后:怎么算是否满足呢?将水仙花数的满足表达式进行代码转换就好了。
实现过程:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <strings.h>
int main()
{
int i=100; //申请变量并初始化,目的在于控制其范围,也可以后面再赋值;
int a,b,c; //申请变量分别接收百十个位数;
while(i<=999) //进入循环体,控制具体范围,也可以用for循环,表达方式有差异;
{
a=i/100; //求百位数
b=i/10%10; //求十位数
c=i%10; //求个位数
if(i==(pow(a,3)+pow(b,3)+pow(c,3))) //判断是否满足条件的表达式,pow 函数数标准C库函数,用来求幂次方;
printf("%d\n",i);
i++;
}
return 0;
}
接下来我们看一下结果:
接下来,我们尝试 for 循环:
12 #include <stdio.h>
13 #include <string.h>
14 #include <stdlib.h>
15 #include <math.h>
16 #include <strings.h>
17 int main()
18 {
19 int i=100;
20 int a,b,c;
21 // while(i<=999)
22 for(i=100;i<1000;i++) //for 循环,注意范围(i<1000)等价于(i<=999)
23 {
24 a=i/100;
25 b=i/10%10;
26 c=i%10;
27 if(i==(pow(a,3)+pow(b,3)+pow(c,3))) //pow(a,3)也可以写成 a*a*a ;
28 {
29 printf("%d\n",i);
30 // i++; //此处是我注释掉的,原程序不需要,请思考如果i++会有什么区别?为什么?
31 }
32 // i++; //此处是我注释掉的,原程序不需要,请思考如果i++会有什么区别?且与30行有什么区别?为什么?
33 }
34 return 0;
35 }
结果如图:
注意:1. 请思考for循环中两处备注与原码的区别,结论异同的原因;
2.for与while 循环时,代码书写区别。