- 中文名
- 水仙花数
- 外文名
- Narcissistic number
- 别 名
- pluperfect digital invariant
- 学 科
- 数学、计算机
附:其他位数的自幂数名字
一位自幂数:独身数
三位自幂数:水仙花数
四位自幂数:四叶玫瑰数
五位自幂数:五角星数
六位自幂数:六合数
七位自幂数:北斗七星数
八位自幂数:八仙数
九位自幂数:九九重阳数
十位自幂数:十全十美数
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477;
九位的九九重阳数共有4个: 146511208,472335975,534494836,912985153;
十位的自幂数只有1个:4679307774
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位以上的水仙花数略)
//方法一
#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;
}
//方法二
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,k,n;
printf("'water flower'number is:");
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("%-5d",n);
}
}
printf("\n");
return 0;
}
//一:C++中水仙花数实现代码
#include<iostream>
using std::cout;
using std::endl;
#define f(a) (a)*(a)*(a)
int main() {
for (int i = 100;i < 1000;i++)
if (f(i % 10) + f(i / 10 % 10) + f(i / 100 % 10) == i)
cout << i << endl;
system("pause");
return 0;
}
//二: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;
}
//方法一
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++;
}
}
}
//方法二
package sy1;
import java.util.Scanner;
public class TestNarcissus2 {
public static void main(String[] agrs) {
System.out.print("指定最大位数N:");
Scanner input = new Scanner(System.in);
int N = input.nextInt();
input.close();
for (int i = 3; i <= N; i++) {
int a[] = new int[i];
int num = (int) Math.pow(10, i - 1) + 1;
System.out.print(i + "位的水仙花数有:\t");
while (num <= Math.pow(10, i)) {
int sum = 0;
for (int j = 0; j < i; j++)
a[j] = (int) (num / Math.pow(10, j) % 10);
for (int j = 0; j < i; j++)
sum = sum + (int) Math.pow(a[j], i);
if (num == sum)
System.out.print(num + "\t");
num++;
}
System.out.print("\n");
}
}
}
#方法一:
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))
#方法二:
def narcissistic_number_2(num):
s = str(num)
length = len(s)
sum_num = 0
for i in s:
sum_num += int(i)**length
if sum_num == num:
print("%d is a %d bit narcissistic_number" % (num, length))
max_num = int(input('请输入最大范围'))
# 获取小于指定数的阿姆斯特朗数
for num in range(0, max_num):
narcissistic_number_1(num) #调用方法一,方法二均可
#方法三
for i in range(1,10):
for j in range(0,10):
for k in range(0,10):
if i*100+j*10+k==i**3+j**3+k**3:
print(i*100+j*10+k)
#四位自幂数:
for i in range(1000, 10000):
a = int(i/1000)
b = int(i % 1000/100)
c = int(i % 100/10)
d = int(i % 10)
if pow(a, 4) + pow(b, 4) + pow(c, 4) + pow(d, 4) == i:
print(i)
<!DOCTYPE html>
<!--包含在HTML中-->
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script type="text/javascript">
var a = 0, b = 0, c = 0;
for (var i = 100; i < 1000; i++)
{
a = i % 10;
b = parseInt(((i / 10) % 10));
c = parseInt(i / 100);
if (i === a * a * a + b * b * b + c * c * c)
{
document.write('水仙花数: ' + i + '<br/>');
}
}
</script>
</body>
</html>
PHP水仙花数实现代码
<?php
//使用系统自带函数,即可实现幂运算,何必画蛇添足,自己写函数
functionis_narcissistic($n)
{
$hundreds=floor($n/100);//分解出百位
$tens=floor($n/10)%10;//分解出十位
$ones=floor($n%10);//分解出个位
return(bool)(pow($hundreds,3)+pow($tens,3)+pow($ones,3)==$n);
}
for($i=100;$i<1000;++$i)
{
if(is_narcissistic($i))
echo$i."\n";
}
die();
?>
PHP所有位数理论输出
<?php
/**
*水仙花数为不小于3位的数字,每位数字的N次幂的和等于该数字.N为该数字的位数
*@namedaffodilsNum水仙花数
*@param$places水仙花位数>=3
*/
functiondaffodilsNum($places=3){//定义位数
if(!defined('PLACES'))define('PLACES',is_numeric($places)?$places:3);
if(PLACES>=3){$min=pow(10,PLACES-1);
//选数范围起始位置
$max=pow(10,PLACES);
//选数范围结束位置//开始选数
for($i=$min,$out='';$i<$max;$i++){$sum=0;
//当前选数下各个幂值的和
$arr=str_split($i);//以字符串方式分割选数
for($j=0;$j<PLACES;++$j)//对每个数字作幂操作并累加
{$sum+=pow($arr[$j],PLACES);if($sum>$i)
//如果当前累加已大于选数,则跳出循环
break;}if($sum==$i)//如果符合定义,将该数字添加到输出队列
$out.=$i."\n";}
//输出队列
echo$out;}
}
echodaffodilsNum(3);
?>
方法一:
for m=100:999
m1=fix(m/100);
m2=rem(fix(m/10),10);
m3=rem(m,10);
if m==m1^3+m2^3+m3^3
disp(m)
end
end
方法二:
m = 100:999;
n = floor(m/100).^3+mod(fix(m/10),10).^3+mod(m,10).^3;
m(find(m==n))
var i = 100
while i < 999 {
let nums = i.description.map({Double($0.description)!})
if nums.map({pow($0,Double(nums.count))}).reduce(0,+) == Double(i) {
print("水仙花:\(i)")
}
i += 1
}
package main
import (
"fmt"
"strconv"
)
func main() {
var a, b int64
fmt.Println("请输入求a,b:")
fmt.Scanf("%d,%d", &a, &b)
if a > b {
a, b = b, a
}
for i := a; i <= b; i++ {
if isNarcissusFew(i) {
fmt.Println(i)
}
}
}
func isNarcissusFew(number int64) bool {
var sum int64
numberStr := strconv.FormatInt(number, 10)
for _, data := range numberStr {
lenght := len(numberStr)
num := (int64)(data - 48)
var sum1 int64 = 1
for lenght != 0 {
sum1 *= num
lenght--
}
sum += sum1
}
if sum == number {
return true
}
return false
}
for(int i=100;i<1000;i++)
{
int bai=0;int shi=0;int ge=0;int baiyushu=0;
bai=i/100;
baiyushu=i%100;
shi=baiyushu/10;
ge=baiyushu%10;
if(i==bai*bai*bai+shi*shi*shi+ge*ge*ge)
{
Console.WriteLine("水仙花数:"+i+"<br>");
}
}
//补充C#水仙花数实现代码(任意位数)
/// <summary>/// 判断一个数是否是水仙花数/// </summary>///
<param name="num">要判断的数</param>///
<returns>判断结果:true-是,false-否</returns>
bool isWaterFlower(int num){if (num <= 0){return false;}
int temp = num;
//将要判断的数值各位上的数字拆开放在集合中
ArrayList list = new ArrayList();
while (temp > 0)
{
list.Add(temp % 10);temp /= 10;}
//判断各位上的数字位数次方之后是否等于要判断是数,是的话则为水仙花数
int sum = 0;
foreach (int i in list)
{
int mul = 1;
for (int j = 0; j < list.Count; j++){mul *= i;}
sum += mul;
}
return sum == num;
}
补充C#中1000以内水仙花数实现代码(同理可根据需求自行增加变量及循环次数,此处仅为举例)
int number = 100; //声明变量number初始值为100
for(int i=1;i<10;i++) //声明百位数的值变量为 i,赋值为1,每次循环加1
{
for(int j=0;j<10;j++) //声明十位数的值变量为j,赋值为0,每次循环加1
{
for(int r=0;r<10;r++) //声明个位数的值为r,赋值为0,每次循环加1
{
if(i*i*i+j*j*j+r*r*r==number)
{
Console.WriteLine("水仙花数:{0}", number);
}
number++; //number加1
}
}
}
begin
integer i,j,k;
for i := 1 step 1 until 9 do
for j := 0 step 1 until 9 do
for k := 0 step 1 until 9 do
if i×i×i + j×j×j + k×k×k = 100×i + 10×j + k then
print (100×i + 10×j + k);
end
program narcissistic_number;
var a,b,c:integer;
begin
for a:=1 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
if a*a*a+b*b*b+c*c*c=100*a+10*b+c then
writeln(100*a+10*b+c);
end.
或
program narcissistic_number;
var a,b,c,d:integer;
begin
for a:=100 to 999 do
begin
b:=a mod 10;
c:=a mod 100 div 10;
d:=a div 100;
if b*b*b+c*c*c+d*d*d=a then
writeln(a);
end;
end.
或
program narcissistic_number;
var a, b, c, i, t : integer;
begin
i := 100;
repeat
a:=trunc(i/100);
b:=trunc(i/10) - a*10;
c:=i-trunc(i/10) * 10;
t:= a*a*a + b*b*b + c*c*c;
if i = t then
writeln(i,'=',a,'^3+',b,'^3+',c,'^3');
i := i + 1 until i > 999
end.
1-999999之间
REM Print all the Narcissistic number
REM between 1 and 999999
FOR i = 1 TO 999999
e$ = STR$(i)
a$ = MID(e$, 1, 1)
b$ = MID(e$, 2, 1)
c$ = MID(e$, 3, 1)
d$ = MID(e$, 4, 1)
a = VAL(a$) AND b = VAL(b$) AND c = VAL(c$) AND d = VAL(d$)
IF i = a ^ 4 + b ^ 4 + c ^ 4 + d ^ 4 THEN PRINT i;
NEXT i
ENDPB
实现的方法(只计3位数)
int s,a,b,c
for s=100 to 999
a=integer(s/100)
b=integer((s - a*100)/10)
c=s - integer(s/10)*10
if s=a^3+b^3+c^3 then
messagebox("",s)
end if
next
Visual Basic 的“水仙花数”实现代码
Private Sub Command1_Click()
Dim i As Integer, a As Integer, b As Integer, c As Integer
For i = 100 To 999 Step 1
a = i \ 100
b = (i - 100 * a) \ 10
c = i - 100 * a - 10 * b
If a^(3) + b^(3) + c^(3) = i Then
Print i
End If
Next i
End Sub
Visual Basic 简单易懂代码实现
Dim a As Integer, b As Integer, c As Integer
For a = 0 To 9
For b = 0 To 9
For c = 0 To 9
If a * 100 + b * 10 + c = a ^ 3 + b ^ 3 + c ^ 3 Then
Console.WriteLine(a * 100 + b * 10 + c)
End If
Next
Next
Next
<%
dim a,b,c,d,m,n,z
i=1
for i=100 to 999
a=mid(i,1,1)
b=mid(i,2,1)
c=mid(i,3,1)
d=a*a*a
m=b*b*b
n=c*c*c
z=d+m+n
if z=i then
response.write z & "<br>"
end if
next
%>
C Print all the Narcissistic numberC between 100 and 999
WRITE(*,30)
DO 10
K=100,999
IA=K/100
IB=MOD(K,100)/10
IC=MOD(K,10)
IF(K.NE.IA**3+IB**3+IC**3) GOTO 10
WRITE(*,20)
K, IA,IB,IC10
CONTINUE20
FORMAT(5X,4I4)30
FORMAT(5X,18HN=I**3+J**3+K**3)
STOP END
[X*100+Y*10+Z||X<-lists:seq(1,9),Y<-lists:seq(0,9),Z<-lists:seq(0,9),X*X*X+Y*Y*Y+Z*Z*Z=:=X*100+Y*10+Z].
fun main(args: Array<String>) {
val n = 5
println(factorial1(n))
println(factorial2(n))
(100..999).filter {
val r = it / 100
val s = (it - r * 100) / 10
val t = it - r * 100 - s * 10
it == r * r * r + s * s * s + t * t * t
}.forEach{ println(it)}
}
sumnum = 0
FOR a = 3 TO 7
?ALLTRIM(STR(a))+"位的水仙花数有: "
FOR i=10^(a-1) TO 10^a-1
FOR m = 1 TO a
n = SUBSTR(ALLTRIM(STR(i)),m,1)
sumnum = sumnum+VAL(n)^a
ENDFOR
IF i = sumnum
??STR(i,a,0)+" "
ENDIF
sumnum = 0
ENDFOR
ENDFOR
Visual FoxPro 用表单实现法(只计3位)
方法一:
clear
for a=1 to 9
for b=0 to 9
for c=0 to 9
x=a*100+b*10+c
if x=a^3+b^3+c^3
?x
endif
endfor
endfor
endfor
方法二:
(1)创建表单Form1并添加文本框Text1与命令按钮Command1
(2)修改Command1的Caption属性为“计算并显示”
(3)为Form1添加方法sxh
(4)修改方法sxh代码如下
para x
x1=int(x%10)
x2=int(x/10)%10
x3=int(x/100)%100
if x=x1^3+x2^3+x3^3
return .t.
else
return .f.
endif
(5)为Command1的Click事件编写如下的事件代码:
thisform.currentx=thisform.width/2
thisform.currenty=thisform.height/2
thisform.print("水仙花数是:")
for m=100 to 999
thisform.text1.value=m
sure=thisform.sxh(m)
if sure=.t.
thisform.print(str(m,4)+space(3))
inkey(0.5)
endif
for 延迟=1 to 20000
yiru=2008610029
endfor
endfor
this.enabled=.f.
let power3 x= x*x*x
let findNarcissisticNumber ()=
seq {100..999}
|> Seq.where (fun num->
let x= num/100 //百位
let y= num%100/10 //十位
let z= num%10 //个位
power3 x + power3 y + power3 z = num)
let narcissisticNumbers= findNarcissisticNumber()
printfn "Narcissistic Numbers :%A" narcissisticNumbers
var n:int;
var m:int;
for (var i:int=1; i<=9; i++) {
for (var j:int=1; i<=9; j++) {
for (var k:int=1; i<=9; k++) {
m=i*100+j*10+k;
if (m==i*i*i+j*j*j+k*k*k)
{ n++; trace(m); }
}
}
}
stack segment stack
dw 256 dup (?)
stack ends
data segment
buf db 3 dup (?)
data ends
code segment
assume cs:code,ds:data,ss:stack
fj proc near ;三位数,百位、十位、个位分开,保存在buf中
push cx
push dx
push si
mov si,0 ;数组下标
mov cx,10
fj1:
mov dx,0
div cx
mov buf[si],dl
inc si
or ax,ax
jnz fj1
mov ax,si
pop si
pop dx
pop cx
ret
fj endp
print proc near ;打印三位数
push cx
push dx
mov dx,-1
push dx
mov cx,10
p1:
mov dx,0
div cx
push dx
or ax,ax
jnz p1
p2:
pop dx
cmp dx,-1
je p9
add dl,30h
mov ah,2
int 21h
jmp p2
p9:
mov dl,9 ;输出制表符Tab
mov ah,2
int 21h
pop dx
pop cx
ret
print endp
start:
mov ax,data
mov ds,ax
mov bx,100
s0:
mov ax,bx
call fj
mov cx,ax
mov si,0 ;数组下标
mov dx,0
s1:
mov al,buf[si] ;以下三行,求立方
mul buf[si]
mul buf[si]
add dx,ax
inc si
loop s1
cmp dx,bx
jne s2
mov ax,dx
call print
s2:
inc bx
cmp bx,1000
jb s0
mov ah,4ch
int 21h
code ends
end start
输出10000以内·水仙花数
function IsNarcLNum(num)
local lenth = string.len(tostring(num))
local sumval = 0
num = math.modf(num)
local data = num
while(data > 0 ) do
sumval = sumval + (math.fmod(data, 10)^lenth)
data = math.modf(data/10)
end
if sumval == num then
return true
else
return false
end
end
val = 10000
for i = 1, val do
if IsNarcLNum(i) then
print(string.format("%d", i))
end
end
var a,b,c,d:integer;
begin for a:=100 to 999 do
begin
b := a div 100;
c := a div 10 mod 10;
d := a mod 10;
if b*b*b+c*c*c+d*d*d=a then
memo1.Lines.Add(inttostr(a))
end
end;
n = 0
for i = 100:999
x1 = Int(floor(i/100))
x2 = Int(floor(i%100/10))
x3 = i%10
if i == x1^3 + x2^3 + x3^3
print(i)
global n = n + 1
end
end
#!/bin/bash
echo -n "请输入数字"
read num
sum=0
len=${#num}
for loop in `seq 0 $[$len-1]`
do
cor="${num:$loop:1}"
if grep '^[[:digit:]]*$' <<< "$cor" > /dev/null; then
sum=$[$sum+$cor**$len]
fi
done
if [ "$sum" == "$num" ];then
echo "是水仙花数"
else
echo "不是水仙花数"
fi