1. 题目描述
求出0~100000之间的所有"水仙花数"并输出。
2. 思路
一开始脑袋都成浆糊了。就是我需要判断这个数字是几位数,我需要求出这个数的每一位,当时混在一起考虑根本然不清。然后就想到了分开,写一个函数单求这个数字是几位数的,单独写一个函数求这个数字的n次方。单独写一个函数来判断它是否是水仙花数。
- 求一个数字有几位数
思路:小于9就是1位数,大于9开始就要计算,所以我们的条件是是否大于9,因为我们需要处理的情况是大于9的,小于9的我们默认就是1
c
int sizeNum(int n)
{
int size = 1;
while (n > 9)
{
n = n / 10;
size++;
}
return size;
}
- 求一个数字的次方
思路:这个也比较简单,需要传入两个参数,我们要求次方的数字,和要求的次方数,for循环,要求几次,乘几次
c
int powNum(int n,int m)
{
int i = 0;
if (n == 0)
{
return 0;
}
int a = 1;
for(int i = 0;i<m;i++)
{
a *= n;
}
return a;
}
- 求水仙花数,这个函数就用到了上面俩函数
思路:先调用求出我们是几位数,函数专心考虑取出我们的每一位,然后调用求次方相加
c
int flawerNum(int n)
{
int sum = 0;
int num = n; //这里我原本是没有另外创建临时变量来接收我们传入的参数,
//然后在if判断的时候就有问题了,我们最后还需要使用这个n的值,所以应该再创建一个局部变量
int size = sizeNum(num);
int i = 0;
for (i = 0; i < size; i++)
{
sum += powNum(num % 10, size);
num = num / 10;
}
if (n == sum)
{
return 1;
}
else
{
return 0;
}
}
3. 代码实现
求0-100000的水仙花数,我们for循环,调用即可。
c
//求出0~100000之间的所有"水仙花数"并输出。
//"水仙花数"是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1 ^ 3+5 ^ 3+3 ^ 3,则153是一个"水仙花数"。
#include<stdio.h>
int sizeNum(int n)
{
int size = 1;
while (n > 9)
{
n = n / 10;
size++;
}
return size;
}
int powNum(int n,int m)
{
int i = 0;
if (n == 0)
{
return 0;
}
int a = 1;
for(int i = 0;i<m;i++)
{
a *= n;
}
return a;
}
int flawerNum(int n)
{
int sum = 0;
int num = n; //这里我原本是没有另外创建临时变量来接收我们传入的参数,
//然后在if判断的时候就有问题了,我们最后还需要使用这个n的值,所以应该再创建一个局部变量
int size = sizeNum(num);
int i = 0;
for (i = 0; i < size; i++)
{
sum += powNum(num % 10, size);
num = num / 10;
}
if (n == sum)
{
return 1;
}
else
{
return 0;
}
}
int main ()
{
//printf("%d ", powNum(5, 3));
//printf("%d ", flawerNum(153));
int num = 0;
for (num = 0;num < 100000; num++)
{
if (flawerNum(num)==1)
{
printf("%d ",num);
}
}
return 0;
}