阿姆斯特朗数 俗称水仙花数 ,它是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
根据水仙花数的定义,要想找出水仙花数,首先要明确该数字有几位数,即n的取值,其次要分离出各位上的数字,求出各位数字的n次方,并将其相加。如果这个和等于这个数本身,则这个数为水仙花数,并将其打印。
(以范围为0~100000为例)
#include<stdio.h>
int power(int n, int k)
{
if (k == 0)
return 1;
else if (k == 1)
return n;
else
return n * power(n, (k - 1));
}
int main()
{
int num = 0;
int sum = 0;
for(num=0;num<=100000;num++)
{
int n = num;
int m = 0;
int k = 0;
while (n)
{
n = n / 10;
k++;
}
n = num;
sum = 0;
while(n)
{
m = n % 10;
sum += power(m , k);
n = n / 10;
}
if (sum == num)
printf("%d ", num);
}
return 0;
}
上述是对输出水仙花数的一个简单的代码实现,为了使其更具有交互性,我们可以优化代码,输入取值范围,示例如下:
#include<stdio.h>
int power(int n, int k)
{
if (k == 0)
return 1;
else if (k == 1)
return n;
else
return n * power(n, (k - 1));
}
int main()
{
int num = 0;
int sum = 0;
int start, end = 0;
scanf("%d %d", &start, &end);
for(num=start;num<=end;num++)
{
int n = num;
int m = 0;
int k = 0;
while (n)
{
n = n / 10;
k++;
}
n = num;
sum = 0;
while(n)
{
m = n % 10;
sum += power(m , k);
n = n / 10;
}
if (sum == num)
printf("%d ", num);
}
return 0;
}
我本人在实际操作中犯了一些小错误,每次得到的sum的值都是前面几次循环的总和,导致只能输出0和1。在经过一番调试之后,发现了这个错误,并及时改正得到正确的结果。由此可见,调试对于我们发现错误是多么重要的一个环节。
另外,不知该程序是否为最优,如有可以优化的环节,希望各位同仁可以指出,以便我及时更正优化。