导航:首页 > 知识科普 > 有哪些巧妙的方法求水仙花数

有哪些巧妙的方法求水仙花数

发布时间:2022-09-18 14:25:35

Ⅰ 水仙花数求法 跪求指点

//求1到100000的水仙花数
public class NarcissisticNumber {
public static void main (String [] args) {
int count = 0;
for(int i=1; i<=100000; i++) {
if(judge(i) == true) {
count++;
System.out.print(i + " "); // 1 153 370 371 407
}
}
System.out.println();//换行
System.out.println("一共有 " + count + " 个水仙花数.");
}

//判断一个数是否为水仙花数
public static boolean judge (int number) {
int count = String.valueOf(number).length() - 1;
//求出number的长度,如4位,则对应是10的3次方, 10的count次方

int level = 0; //每一个位数
int sum = 0; //每一个位数的三次方的和
boolean b = false; //默认为false,即默认为非水仙花数
int temp = number; //从高位到低位逐位截取,即4位数变位3位数,3位数变为2位数...
while (count >= 0) {
level = temp / ((int)Math.pow(10,count));
sum = sum + (int)Math.pow(level,3);
temp = temp % ((int)Math.pow(10,count)); //由千位数变位百位,百位变为十位...
count--;
}
if(sum == number) { //是水仙花数
return (b = true);
}
return b; //不是水仙花数,b默认为false
}
}

Ⅱ 求三位数水仙花数的算法怎么设计

算法是从100到999中依次取出1个三位数进行枚举水仙花数判断,第一步:求出这个三位数的百位、十位、个位的数字分别存在3个变量中, 例如:三位数321,百位3存在x中,十位2存在y中,个位1存在

Ⅲ 水仙花数的求取方法(非高精度)

以下为在各种编程语言中实现求取水仙花数的方法(非高精度)。 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. 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 <%
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
%>
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. 1-999999之间
REM Print all the Narcissistic numberREM between 1 and 999999FOR 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 iENDPB 实现的方法(只计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 (100-999)
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)) endend; (100-999)
方法一:
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
方法二(可现不定位数解):
n=Input[请输入大于2的自然数n:];
For[i=10^(n-1),i<10^n-1,i++,
If[Total[IntegerDigits^IntegerLength]==i,
Print]]
BASH 脚本实现计算100-999之内数#!/bin/bashfor (( a=1; a<10; a++ ))do for (( b=0; b<10; b++ )) do for (( c=0; c<10; c++ )) do number1=$((a*100+b*10+c)) number2=$((a**3+b**3+c**3)) if [ $number1 -eq $number2 ]; then echo $number1 fi done donedone易语言代码 求指定范围内水仙花数
.版本 2
.子程序 取出水仙花数, 整数型, , 返回范围内水仙花数个数,如果范围过大将会十分耗时
.参数 起始数字, 整数型, , 从此数开始判断是否为水仙花数
.参数 结束数字, 整数型, , 此数必须大于起始数字
.参数 保存得到水仙花数的数组, 整数型, 可空 数组
.局部变量 数字数组, 文本型, , 0
.局部变量 水仙花数, 整数型, , 0
.局部变量 总和, 整数型
.局部变量 计次, 整数型
.局部变量 计次2, 整数型
.如果真 (起始数字 > 结束数字)
清除数组 (保存得到水仙花数的数组)
返回 (0)
.如果真结束
.变量循环首 (起始数字, 结束数字, 1, 计次)
.计次循环首 (取文本长度 (到文本 (计次)), 计次2)
加入成员 (数字数组, 取文本中间 (到文本 (计次), 计次2, 1))
处理事件 ()
.计次循环尾 ()
.计次循环首 (取数组成员数 (数字数组), 计次2)
总和 = 总和 + 求次方 (到数值 (数字数组 [计次2]), 取文本长度 (到文本 (计次)))
处理事件 ()
.计次循环尾 ()
.如果真 (总和 = 计次)
加入成员 (水仙花数, 计次)
.如果真结束
处理事件 ()
.变量循环尾 ()
保存得到水仙花数的数组 = 水仙花数
返回 (取数组成员数 (水仙花数))
BAT 计算100~999之间的水仙花数
@echo off&setlocal enabledelayedexpansion
for /l %%a in (1,1,9) do (
for /l %%b in (0,1,9) do (
for /l %%c in (0,1,9) do (
set /a ver1=%%a%%b%%c,ver2=%%a*%%a*%%a+%%b*%%b*%%b+%%c*%%c*%%c
if !ver1! == !ver2! echo !ver1!)))
pause>nul stack segment stack
dw 256 p (?)
stack ends
data segment
buf db 3 p (?)
data ends
code segment
assume cs:code,ds:data,ss:stack
fj proc near
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
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 思想:枚举n位数字中0——9出现的次数,根据枚举的次数算出一个数,对比这个数中0——9出现的次数是否等于枚举的0——9出现的次数相等。如果相等,则该数是水仙花数。 #include<stdio.h>#include<string.h>#include<vector>#include<string>#include<iostream>#include<algorithm>usingnamespacestd;#defineDIGIT21//每次就只用改变这里,就可以算出不同位数的水仙花数了。如果要想算出所用的,这里就写最大,然后再在程序里加一层循环就是咯intCount[10];//Count用来保存枚举是0——9出现的次数,用以和算出来的值各数字出现次数进行对比。intcnt1,num1[10][DIGIT+1][DIGIT+1];//cnt1是符合条件的个数。num1用来保存0——9分别出现0——DIGIT次对应的答案charans[10][DIGIT+1];//保存符合条件的答案//这两个就是为了排序方便一点vector<string>v;strings[10];voiddeal(){intcnt[10];//保存算出来的数0——9出现的次数,用以和Count对比看是否满足条件intno[DIGIT+1];//算出来的数memset(no,0,sizeof(no));memset(cnt,0,sizeof(cnt));for(intk=1;k<10;k++){if(num1[k][Count[k]][DIGIT]!=0){return;}for(inti=0;i<DIGIT;i++){no[i]+=num1[k][Count[k]][i];if(no[i]>9){no[i+1]+=(no[i]/10);no[i]%=10;}}}if(no[DIGIT]!=0){return;}if(no[DIGIT-1]!=0){intflag=0;for(intj=0;j<DIGIT;j++){cnt[no[j]]++;}for(intj=0;j<10;j++){if(cnt[j]!=Count[j]){flag=1;break;}}if(!flag){ans[cnt1][DIGIT]='';for(intj=0,k=DIGIT-1;j<DIGIT;j++,k--){ans[cnt1][k]=no[j]+'0';}s[cnt1]=ans[cnt1];v.push_back(s[cnt1]);cnt1++;}}};intmain()//计算从0——9出现分别0——DIGIT次时的值{for(inti=1;i<10;i++){num1[i][1][0]=1;intindex=0;for(intj=1;j<=DIGIT;j++){for(intr=0;r<=index;r++){num1[i][1][r]*=i;}for(intr=0;r<=index;r++){if(num1[i][1][r]>9){num1[i][1][r+1]+=(num1[i][1][r]/10);num1[i][1][r]%=10;}}while(index<DIGIT-1&&num1[i][1][index+1]>0){index++;if(num1[i][1][index]>9){num1[i][1][index+1]+=(num1[i][1][index]/10);num1[i][1][index]%=10;}}}for(intj=2;j<=DIGIT;j++){for(intr=0;r<=DIGIT;r++){num1[i][j][r]=num1[i][1][r]*j;}for(intr=0;r<DIGIT;r++){if(num1[i][j][r]>9){num1[i][j][r+1]+=(num1[i][j][r]/10);num1[i][j][r]%=10;}}}}//枚举0——9分别出现0——DIGIT次的情况,0——9分别对应a——jfor(inta=0;a<=DIGIT;a++){Count[0]=a;for(intb=0;b<=DIGIT;b++){if(a+b>DIGIT)//保证出现的次数不大于DIGIT,下同{break;}Count[1]=b;for(intc=0;c<=DIGIT;c++){if(a+b+c>DIGIT){break;}Count[2]=c;for(intd=0;d<=DIGIT;d++){if(a+b+c+d>DIGIT){break;}Count[3]=d;for(inte=0;e<=DIGIT;e++){if(a+b+c+d+e>DIGIT){break;}Count[4]=e;for(intf=0;f<=DIGIT;f++){if(a+b+c+d+e+f>DIGIT){break;}Count[5]=f;for(intg=0;g<=DIGIT;g++){if(a+b+c+d+e+f+g>DIGIT){break;}Count[6]=g;for(inth=0;h<=DIGIT;h++){if(a+b+c+d+e+f+g+h>DIGIT){break;}Count[7]=h;for(inti=0;i<=DIGIT;i++){if(a+b+c+e+f+g+h+i>DIGIT){break;}Count[8]=i;intj=DIGIT-a-b-c-d-e-f-g-h-i;if(j<0){break;}Count[9]=j;deal();}}}}}}}}}//排序,将答案从小到大输出sort(v.begin(),v.end());for(inti=0;i<v.size();i++){cout<<v[i]<<endl;}return0;}

Ⅳ 求水仙花数最速求解算法

/*
128468643043731391252
449177399146038697307*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

/*
128468643043731391252
449177399146038697307*/
//我的程序只用了34秒
//乍一下很难,很容易往那个一位位枚举数字的方向去,但是这样的复杂度很高,尽管加上了一些判断还是于事无补
//我说一下思路吧,先把所有的数字的21次方求出来放在一个数组里保存,然后再去枚举每一个数字有几个,
//总共加起来是二十一位数字,这个枚举的操作次数相对刚才的那个是小多了,
//然后把这些数的21次方加起来,然后再去判断一下,是不是由这些数字组成就行了

const int BIT=100000000;
struct BigNum
{
int dig[6];
int len;
void Clr()
{
memset(dig,0,sizeof(dig));
len=1;
}
void Print()
{
int i;
printf("%d",dig[len-1]);
for(i=len-2;i>=0;i--)
printf("%08d",dig[i]);
puts("");
}
};
BigNum p[10],MAX,MIN;
BigNum sp[10][22];
int take[10]={0};
int LEN=21;
int GetLen(BigNum a)
{
int i;
for(i=5;i>0&&a.dig[i]==0;i--);
return i+1;
}
BigNum CarryUp(BigNum a)
{
int i;
for(i=0;i<a.len;i++)
{
a.dig[i+1]+=a.dig[i]/BIT;
a.dig[i]%=BIT;
}
return a;
}
BigNum Multi(BigNum a,BigNum b)
{
BigNum c;
int i,j,k;
c.Clr();
c.len=a.len+b.len;
for(i=0;i<a.len;i++)
{
for(j=0;j <b.len;j++)
{
c.dig[i+j]+=a.dig[i]*b.dig[j];
}
}
c=CarryUp(c);
if(c.len>0&&c.dig[c.len-1]==0)c.len--;
return c;
}
BigNum MyPow(BigNum a,int n)
{
BigNum ret;
ret.Clr();
ret.dig[0]++;
while(n--)
{
ret=Multi(ret,a);
}
return ret;
}
int Cmp(BigNum a,BigNum b)
{
if(a.len>b.len)return 1;
if(a.len<b.len)return -1;
int i;
for(i=a.len-1;i>=0&&a.dig[i]==b.dig[i];i--);
if(i==-1)return 0;
return a.dig[i]-b.dig[i];
}
BigNum Add(BigNum a,BigNum b)
{
int i;
if(b.len>a.len)a.len=b.len;
for(i=0;i<a.len;i++)
{
a.dig[i]+=b.dig[i];
}
a=CarryUp(a);
if(a.dig[a.len])a.len++;
return a;
}
BigNum Deal(BigNum a)
{
int i;
BigNum b;
b.Clr();
b.len=3;

for(i=7;i>=0;i--)
{
b.dig[0]=b.dig[0]*10+a.dig[i];
}
for(i=15;i>=8;i--)
{
b.dig[1]=b.dig[1]*10+a.dig[i];
}
for(i=23;i>=16;i--)
{
b.dig[2]=b.dig[2]*10+a.dig[i];
}
return b;
}
bool ok(BigNum sum)
{
int aa[10]={0};
int i;
for(i=0;i<8;i++)
{
aa[sum.dig[0]%10]++;
aa[sum.dig[1]%10]++;
sum.dig[0]/=10;
sum.dig[1]/=10;
}
for(i=0;i<5;i++)
{
aa[sum.dig[2]%10]++;
sum.dig[2]/=10;
}
for(i=0;i<10&&aa[i]==take[i];i++);
return i==10;
}
void DFS(int deep,BigNum Sum,int leave)
{
BigNum check;
BigNum cc;
int i;
if(deep==10)
{
if(leave>0)return;

if(ok(Sum))
{
Sum.Print();
}
return ;
}

for(i=0;i<=leave;i++)
{
take[deep]=i;
check=Add(Sum,sp[deep][i]);
if(Cmp(check,MAX)>=0)break;
cc=Add(check,sp[9][leave-i]);
if(Cmp(cc,MIN)<0)continue;
DFS(deep+1,check,leave-i);
}
}
int main()
{
int i;
int j;
BigNum tmp;
BigNum sum;
tmp.Clr();
int start=time(NULL),finish;

for(i=0;i<10;i++)
{
p[i]=MyPow(tmp,LEN);
tmp.dig[0]++;
}
for(i=0;i<10;i++)sp[i][0].Clr();
for(j=0;j<10;j++)
for(i=1;i<22;i++)
{
sp[j][i]=Add(sp[j][i-1],p[j]);
}
tmp.Clr();
tmp.len=LEN;

sum.Clr();
MAX.dig[2]=100000;
MAX.len=3;
MIN.dig[2]=10000;
MIN.len=3;
DFS(0,sum,LEN);
finish = time(NULL);
printf("%d\n",(finish-start));
return 0;
}

Ⅳ 用更简便方法求水仙花数

#include<stdio.h>
#include<math.h>
intmain()
{
intm,n,i,sum,tmp,pows;
intd=0;
scanf("%d%d",&m,&n);
if(m<100)m=100;//100以内没有
for(i=m;i<=n;i++)
{
inta=i;
sum=0;
pows=0;
while(a){//计算位数
tmp=a%10;
a=a/10;
++pows;
}
a=i;
while(a){//计算和
tmp=a%10;
sum+=pow(tmp,pows);
a=a/10;
}
if(i==sum){
printf("%d ",i);
d++;
}
}
if(d==0)
printf("no");
return0;

}

计算结果:

6 10000
153
370
371
407
1634
8208
9474
Press any key to continue

LS的只能计算100-1000的数

Ⅵ 水仙花数计算方法什么

水仙花数计算方法:是指一个
n
位数
(
n≥3
),它的每个位上的数字的
n
次幂之和等于它本身。(例如:1^3
+
5^3
+
3^3
=
153)
水仙花数计算方法,是一种程序代码用的方法。好比C语言,Java之类的软件。

Ⅶ 计算机算法水仙花怎么算!急啊

C语言水仙花数(详解版)

问题描述

输出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身,例如153是“水仙花数”,因为:153 = 13 + 53 + 33。

问题分析

根据“水仙花数”的定义,判断一个数是否为“水仙花数”,最重要的是要把给出的三位数的个位、十位、百位分别拆分,并求其立方和(设为s),若s与给出的三位数相等, 三位数为“水仙花数”,反之,则不是。

算法设计

“水仙花数”是指满足某一条件的三位数,根据这一信息可以确定整数的取值范围是 100〜999。对应的循环条件如
下:
for(n=10; n<1000; n++){ //......}

对代码的说明:将n整除以100,得出n在百位上的数字hun。将(n-i*100)整除以10(或将n先整除以10再对10求模n/10%10),得出n在十位上的数字ten。将n对10取余,得出n在个位上的数字ind。求得这三个数字的立方和是否与其本身相等,若相等,则该数为水仙花数。
对于每个位置上的数值将其拆分的算法有很多种,根据不同情况选择不同算法(对于同一问题不同算法的效率有时会相差很多)。

下面是完整的代码:

#include <stdio.h>
int main()
{ int hun, ten, ind, n; printf("result is:");
for( n=100; n<1000; n++ ) /*整数的取值范围*/
{ hun = n / 100; ten = (n-hun*100) / 10;
ind = n % 10;
if(n == hun*hun*hun + ten*ten*ten + ind*ind*ind) /*各位上的立方和是否与原数n相等*/ printf("%d ", n); } printf("\n"); return 0;}
以上资料来自网上仅供参考.

Ⅷ 水仙花数计算方法是什么

水仙花数计算方法:是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)

Ⅸ 求三位数水仙花数

水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。

三位的水仙花数共有4个:153,370,371,407;

加一下就可以了,

153+370+371+407=1301

C语言:

#include <stdio.h>

int main(void)

{

int a,b,c;

for(a=1;a<=9;a++)

for(b=0;b<=9;b++)

for(c=0;c<=9;c++)

if(100*a+10*b+c==a*a*a+b*b*b+c*c*c)

printf("%d%d%d\n",a,b,c);

return 0;

}

Ⅹ 求水仙花数,三位数内,我用C写了一个,求高手看看还有更简单的方法没,或者请帮我把程序精简一下,谢谢啦

#include "stdio.h"
void s(int shu)
{
int g,h,b;
for(shu=100;shu<=999;shu++)
{
g=shu%10;
h=shu/10%10;
b=shu/100;
if(shu==g*g*g+h*h*h+b*b*b)
printf("%d\t",shu);
}
}
void main()
{
int a;
printf("水仙花数有:");
s(a);
}

阅读全文

与有哪些巧妙的方法求水仙花数相关的资料

热点内容
焦油含量检测方法 浏览:289
草酸用什么方法能够去掉 浏览:224
红参原液的使用方法 浏览:1002
用电脑键盘关机操作方法 浏览:741
牛皮癣运动治疗方法有哪些 浏览:503
喷雾香水使用方法 浏览:682
戒除美沙酮的最佳方法 浏览:12
大池过滤器安装方法 浏览:507
测量方法技术的起源 浏览:362
岗位分析方法的选择依据是 浏览:983
食用铸铁消除内应力最好的方法 浏览:517
测量透镜焦距的方法哪个好 浏览:194
3x97简便计算方法 浏览:557
益节美国氨糖食用方法 浏览:561
飞利浦温奶器使用方法 浏览:925
FDMS颗粒物测量方法 浏览:777
2015新君威后备箱进水解决方法 浏览:931
北京标杆企业调研方法有哪些 浏览:115
铅笔生活技巧和方法 浏览:539
烟气控制方法有哪些 浏览:695