水仙花数的总结概括以及各种代码实现(最详细)

生活中一些常用的规则 需要我们掌握,比如水仙花数,斐波纳契法则等

水仙花数

百度百科解释
  水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。

定义

水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。

附:其他位数的自幂数名字
  • 两位自幂数:没有
  • 三位自幂数:水仙花数
  • 四位自幂数:四叶玫瑰数
    • 四叶玫瑰数
      Description
      四叶玫瑰数是指四位数各位上的数字的四次方之和等于本身的数。
  • 五位自幂数:五角星数
    • 五角星数是指五位数各位上的数字的5次方之和等于本身的数 10000 - 99999
  • 六位自幂数:六合数
  • 七位自幂数:北斗七星数
  • 八位自幂数:八仙数
  • 九位自幂数:九九重阳数
  • 十位自幂数:十全十美数

常见水仙花数

  • 水仙花数又称阿姆斯特朗数。
  • 三位的水仙花数共有4个:153,370,371,407;
  • 四位的四叶玫瑰数共有3个:1634,8208,9474;
  • 五位的五角星数共有3个:54748,92727,93084;
  • 六位的六合数只有1个:548834;
  • 七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
  • 八位的八仙数共有3个:24678050,24678051,88593477

使用高精度计算,可以得到超过int类型上限的水仙花数:
5: 93084
5: 92727
5: 54748
6: 548834
7: 9800817
7: 4210818
7: 1741725
7: 9926315
8: 24678050
8: 24678051
8: 88593477
9: 146511208
9: 472335975
9: 534494836
9: 912985153
10: 4679307774
11: 32164049650
11: 40028394225
11: 42678290603
11: 49388550606
11: 32164049651
11: 94204591914
11: 44708635679
11: 82693916578
14: 28116440335967
16: 4338281769391370
16: 4338281769391371
17: 21897142587612075
17: 35641594208964132
17: 35875699062250035
19: 1517841543307505039
19: 3289582984443187032
19: 4929273885928088826
19: 4498128791164624869
20: 63105425988599693916
21: 449177399146038697307
21: 128468643043731391252
23: 27907865009977052567814
23: 35452590104031691935943
23: 27879694893054074471405
23: 21887696841122916288858
24: 174088005938065293023722
24: 188451485447897896036875
(为环保起见,24位以上的水仙花数略)
最大的水仙花数有39位。十进制自然数中的所有水仙花数共有88个。

求取方法

(非高精度)
以下为在各种编程语言中实现求取水仙花数的方法(非高精度)。

C实现
//方法一
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int cube(const int n){
    return n*n*n;
}
bool
isNarcissistic(const int n){//判断是不是水仙花数
    int hundreds=n/100;
    int tens=n/10-hundreds*10;
    int ones=n%10;
    return cube(hundreds)+cube(tens)+cube(ones)==n;
}
int main(void){
    int i;
    for(i=100;i<1000;++i){
        if(isNarcissistic(i))
        printf("%d\n",i);
    }
    return 0;

C++ 实现
//二:C++中任意位数水仙花数实现代码
#include<iostream>
#include<cmath>
using namespace std;
int main(])
{
    long n1, n2, a;
    int i;
    cout << "请输入Narcissistic number的位数:" << endl;
    cin >> i;
    cout << i << "位数的Narcissistic number包括:" << endl;
    for (n1 = pow(10, i - 1); n1 < pow(10, i); n1++)
    {
        n2 = 0;
        for (int j=0; j < i; j++)
        {
            a = pow(10, j);
            a = n1 / a;
            a = a % 10;
            a = pow(a, i);
            n2 = n2 + a;
        }
        if (n1 == n2)
            cout << n1 << endl;
    }
    return 0;
}
Java 实现
package sy1;
public class TestNarcissus {
     public static void main(String[] args) { 
     int num = 100; int a[] = new int[3];
     System.out.print("3位的水仙花数有:\t"); 
     while (num <= 999) { 
             int sum =0; 
             a[0] = num / 100 % 10;
             a[1] = num / 10 % 10; 
             a[2] = num % 10;
              for (int i = 0; i < 3; i++) {
                  sum = sum + (int) Math.pow(a[i], 3); 
              } 
              if (num ==sum) { 
                  System.out.print(num + "\t"); } num++; 
              } 
      }
    }
}
Python 实现
def narcissistic_number_1(num):
    length = len(str(num))
    count = length
    num_sum = 0
    while count:
        num_sum += ((num // 10 ** (count - 1)) % 10) ** length
        count -= 1
    if num_sum == num:
        print("%d is %d bit narcissistic_number" % (num, length))

文章参考: https://baike.baidu.com/item/%E6%B0%B4%E4%BB%99%E8%8A%B1%E6%95%B0/2746160?fr=aladdin

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘川之水&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值