什么是水仙花数?
水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。
我们本次输出0 ~ 10000区间的水仙花数
制作前要
首先我们需要:
1.判断该数字是几位数
2.求出数字的个位数、十位数、百位数.....
3.将第二步求出的数字分别乘上n次方
4.判断该数字是不是水仙花数
是:输出
不是:continue(跳过)
开始制作:
1.判断该数字是几位数:
我们可以将变量(c)/=10,除一次 b + 1
这样,c == 0时,b刚好等于a的位数
如:do{
c /= 10;
b++;
while(a > 0);
比如:c = 123;
那么b的计算过程就是:
c /= 10 ,c = 12;b = 1
再次循环 c = 1; b = 2;
再次循环c = 0; b = 3;
跳出判断数字时几位数的循环;
2.求出数字的个位数、十位数、百位数...
考虑到a是循环中不能变的变量(如果变了,会影响到整个循环)
所以我们需要专门设置一个局部变量,令其 = a;、
我们用number = a
用number来计算每位数的具体值
个位数= number % 10;
十位数需要在number的基础上 / 10,然后再%10,求出来的就是十位数上的数字
以此类推:
我们令a=1234,来测试一下
通过监视,我们可以看到。每位数都对应上了
3.将第二步求出的数字分别乘上n次方
我们在前面计算出了a是几位数。因此可以利用if判断语句,将不同的结果,送往不同的计算分支里
几位数,就是几次方。
我们直接再次设置一个局部变量(number)
注:这里的number和前文的number都是局部变量,但是不是同一个区间。所以并不冲突
number= 每位数的n次方
4.判断该数字是不是水仙花数
这个可以说是最简单的了,我们只需要一个简单的判断语句
if(a == number),成立则输出,不成立则跳过
这四步做完,我们的代码就敲好了。
结果大概为:
代码:
#define _CRT_SECUER_NO_WARNINGS1
#include <stdio.h>
int main()
{
int a;
int b;
int c = 0;
for (a = 0; a < 10000; a++) {
int number = a;
int one = number % 10;
int tow = (number /= 10) % 10;
int three = (number /= 10) % 10;
int four = (number /= 10) % 10;
b = 0;
c = a;
do{
c /= 10;
b++;
}while (c > 0 );
if (b == 1) {
printf("%d ", a);
}
else if (b == 2) {
int number = a % 10 * a % 10 + a / 10 * a / 10;
if(a == number) {
printf("%d", number);
}
else {
continue;
}
}
else if (b == 3) {
int number = (one * one * one) + (tow * tow * tow) + (three * three * three);
if (a == number) {
printf("%d ", number);
}
else {
continue;
}
}
else if (b == 4) {
int number = (one * one * one * one) + (tow * tow * tow * tow) + (three * three * three * three) + (four * four * four * four);
if(a == number) {
printf("%d ", number);
}
else {
continue;
}
}
}
return 0;
}