在数论中,水仙花数(Narcissistic number)[1][2],也被称为超完全数字不变数(pluperfect digital invariant, PPDI)[3]、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number)[4] ,用来描述一个N位非负整数,其各个位数字的N次方和等于该数本身。十进制下的水仙花数有88个。
代码如下:
#include<stdio.h>
#include<math.h>
int bits(long a)
{
int b=0;
do
{
b=b+1;
} while (a/10);
return b;
}
int main()
{
long a ;long s;long k=0;
int i=1;int j=0;
printf("All the Narcissistic number is:\n");
for(a=0;i<=90;a++)
{
j=bits(a);
k=a;
do
{
s=s+(a%10)^j;
} while (a=a/10);
if(s==k)
printf("NO.%d:%ld \n",i++,a);
}
}
额,注释乱码了,我也没有加,bits函数的作用是求出每一步的a到底有多少位,然后返回到b,j=b;做位数幂运算的累加。
比较累加后的数和原数字a有没有相等,如果相等的话就输出并且将i+1,直到i>90为止。
然后我的这个是可以弄出来89个10进制的水仙花数的,然后在运行的时候出了一点问题。
就是等待时间太长,代码效率太低。根本没有实用价值。但是我在网上看了一下别人写的关于水仙花数求法的相关代码。
他们呢,只是求出了3位数的水仙花数,1位数,2位数等等甚至10位数的都没求,我刚才在开头说了,十进制的水仙花数一共有89个。但是这样代码效率又太低,有没有什么两全其美的方法?这个问题有待进一步讨论,如果有能解决这个问题的大拿,还望赐教。