题目
求出0~100000之间的所有“水仙花数”并输出。
水仙花数的定义
水仙花数是指一个 n 位数(n≥3),它的每个位上的数字的 n 次幂之和等于它本身。例如,153是一个3位数,1^3 + 5^3 + 3^3 = 153,所以153是一个水仙花数。
解法一(纯for循环)
这个代码用来理解基本思路,学了for循环就可以了。
#include<stdio.h>
int main()
{
//水仙花数是三位数,从100开始,这题目混淆视听,生气气!
for (int i = 100; i < 1000; i++)
{
int a = i % 10;
int b = (i / 10) % 10;
int c = i / 100;
if (i == a * a * a + b * b * b + c * c * c)
{
printf("%d ", i);
}
}
for (int i = 1000; i < 10000; i++)
{
int a = i % 10;
int b = (i / 10) % 10;
int c = (i / 100) % 10;
int d = i / 1000;
if (i == a * a * a * a + b * b * b * b + c * c * c * c + d * d * d * d)
{
printf("%d ", i);
}
}
for (int i = 10000; i < 100000; i++)
{
int a = i % 10;
int b = (i / 10) % 10;
int c = (i / 100) % 10;
int d = (i / 1000) % 10;
int e = i / 10000;
if (i == a * a * a * a * a + b * b * b * b * b + c * c * c * c * c + d * d * d * d * d +e * e * e * e * e)
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}
解法二(for+while循环)
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
//水仙花数是三位数,从100开始,这题目混淆视听,生气气!
for(i=100; i<=99999; i++)
{
int count = 1;
int tmp = i;
int sum = 0;
while(tmp/10)
{
count++;
tmp = tmp/10;
}
tmp = i;
while(tmp)
{
sum += pow(tmp%10, count);
tmp = tmp/10;
}
if(sum == i)
printf("%d ", i);
}
printf("\n");
return 0;
}
❤️for循环确定要排查的范围。
❤️定义变量并初始化【count是指数,tmp是底数。】
❤️i<10的进不去while(tmp/10),因为tmp=i,所以这时候tmp/10=0【’ / ’ 运算会把小数抹掉,比如9/10=0(把0.9的小数9抹掉)】,0为假,进不了循环。但 i>10 就能进了,比如11。
讲解while(tmp/10)
while(tmp/10)
{
count++;
tmp = tmp/10;
}
❤️while(tmp/10)的作用:计算指数。
指数count从1开始。
以下i=tmp,只是遍历喜欢说i
当 i 为两位数时,可以进入循环,count+1=2【对应代码是 tmp = tmp/10; 】,两位数再 “/10” 就为0了 ,0为假,进不了循环。
当 i 为三位数时,循环条件while(tmp/10)的结果为两位数,不为0,进入循环,count+1=2;加加完后继续往下执行 tmp = tmp/10; ,即tmp变成了两位数,然后就是上面对于i为两位数的情况的解释了,只不过 新count=旧count+1=2+1=3。循环。
i为其它位数同理。
❤️以下图片中 tmp = i; 的作用是避免tmp=i被它上面while循环中的操作改变,影响下面的操作。
❤️满足定义就打印。
库函数pow的使用
while(tmp)
{
sum += pow(tmp%10, count);
tmp = tmp/10;
}
格式为pow(底数,指数);
如pow(7,3)即7的3次方,pow(7,3)=777=343。
此处*tmp = tmp/10;*的作用是更新位数,比如111/10=11,由三位数变成两位数。
sum += pow(tmp%10, count);中 tmp%10 的作用是取最后一位作为底数,如123%10=3。【’ % ’ 的作用是取余】
运行结果(两个代码都一样)
加油
今天的你又向目标迈进了!
❤️❤️❤️ 恭喜! 恭喜! 又收了一名小弟! ❤️❤️❤️