生活中一些常用的规则 需要我们掌握,比如水仙花数,斐波纳契法则等
水仙花数
百度百科解释:
水仙花数(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