c语言打印水仙花数及拓展



水仙花数是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3,则153是一个“水仙花数”。指一N位数,其各个数之N次方和等于该数。例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数。严格来说,水仙花数指三位数的三次幂各数字的3次方之和等于其本身。以下介绍了如何打印水仙花数及n位数的求解方法。
 首先介绍课本上的方法:

//打印水仙花数

#include <stdio.h>
int main()
{ int i,j,k,n;
printf("水仙花数:",n);

 for(n=100;n<1000;n++)
 { i=n/100;
 j=( n/10)%10;
  k=n%10;
   if(n==i*i*i+j*j*j+k*k*k)
    printf("%d ",n); }
return 0; }
利用该方法打印四叶玫瑰数的样例如下:
//打印四叶玫瑰数

#include <stdio.h>
int main()
{ int i,j,k,m,n;
printf("四叶玫瑰数:");
for(n=1000;n<10000;n++)
 { i=n/1000;
 j=n/100%10;
  k=n/10%10;
  m= n%10;
   if(n==i*i*i*i+j*j*j*j+k*k*k*k+m*m*m*m)
    printf("%d ",n); }
return 0; }

这种方法简单易懂,但是当n值较大时步骤更为繁琐。在此介绍两种相对简单的求解步骤:
//1.打印水仙花数

#include <stdio.h>
int main( )
{
     int i,k,n,sum;
     printf("水仙花数:");
     for(i=100;i<1000;i++)
     {
          for(sum=0,k=i;k;k/=10)
          {
               n=k%10;
               sum+=n*n*n;
          }
          if(i==sum) printf("%d ",i);
     }
return 0;
}

由此可知求解四叶玫瑰数可写为:
//1.打印四叶玫瑰数
#include <stdio.h>
int main( )
{
     int i,k,n,sum;
     printf("四叶玫瑰数:");
     for(i=1000;i<10000;i++)
     {
          for(sum=0,k=i;k;k/=10)
          {
               n=k%10;
               sum+=n*n*n*n;
          }
          if(i==sum) printf("%d ",i);
     }
return 0;
}

这种算法省去了逐个求解的步骤,较为方便。求五角星数等只需改变循环条件和n次幂即可。再介绍另一种求解步骤。

//2.打印水仙花数

#include <stdio.h>
#include <math.h>
int main()
{ int i,m,sum;
printf("水仙花数:");
for(i=100;i<1000;i++)
 { sum=0;
    m=i;
 do {        sum=sum+pow(m%10,3);//pow(a,b)是指a的b次幂是double型的
 m=m/10; } while(m!=0);
 if(sum==i)
 printf("%d ",i); }
  return 0; }

由此可有
//2.打印四叶玫瑰数
#include <stdio.h>
#include <math.h>
int main()
{ int i,m,sum;
printf("四叶玫瑰数:");
for(i=1000;i<10000;i++)
 { sum=0;
    m=i;
 do {  sum=sum+pow(m%10,4);
 m=m/10; } while(m!=0);
 if(sum==i)
 printf("%d ",i); }
  return 0; }

当要打印五角星数,六合数时也是只需改变循环条件及几次幂即可。这两种可以作为求解n位数的自幂数的求解框架,根据个人喜欢套用即可。哈哈哈哈,是不是很好用捏。要是有什么不明白的,欢迎评论咨询哟。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值