如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。编程计算并输出所有的n的所有情况。
慕课上的题是这样:
如果一个n位正整数等于它的n个数字的n次方和,则称该数为n位自方幂数。四位自方幂数称为玫瑰花数。编程计算并输出所有的玫瑰花数。
MOOC只让算出4位数的,而我跟一个傻子一样把1到n的全都输出了,不过把下面的for循环改一改就对了
#include<stdio.h>
#include<math.h>
/*这个lv函数用来将n的每一位数都分离*/
int lv(int n,int a[])
{
int i,p=0;
int lp[1000];
for(i=0,p=0;;i++)
{
a[i]=n%10;
n=n/10;
lp[i]=n;
p++;
if(lp[i]==0)/*当它lp[i]=0的时候n也就是等于0,他们一直除以10,用p计算除了多少次*/
break;/*p等于2的时候就是两位数,除了3次,最后一次除以一定等于0,才跳出*/
}
return p;
}
int main()
{
int a[1000];
int i,p,j,sum=0;
for(i=1000;i<10000;i++)/*慕课上要求是四位数,在这里要求一下就可以了,(i=1000;i<10000;i++)*/
{
p=lv(i,a);/*这里调用函数,p也就是表示了有几位数*/
for(j=0,sum=0;j<p;j++)/*这个for循环用来计算n的几次幂的和*/
{
sum=sum+pow(a[j],p);
}
if(sum==i)/*判断几次幂的和是否和i相等*/
printf("%d\n",i);
}
return 0;
}
下面这个不是四位数,是1到n的
#include<stdio.h>
#include<math.h>
int lv(int n,int a[])
{
int i,p=0;
int lp[1000];
for(i=0,p=0;;i++)
{
a[i]=n%10;
n=n/10;
lp[i]=n;
p++;
if(lp[i]==0)
break;
}
return p;
}
int main()
{
int a[1000];
int i,p,j,sum=0;
for(i=1;;i++)
{
p=lv(i,a);
for(j=0,sum=0;j<p;j++)
{
sum=sum+pow(a[j],p);
}
if(sum==i)
printf("%d\n",i);
}
return 0;
}
这里只计算到了88593477,下面估计还有好多,