水仙花数计算的公式(水仙花公式怎么计算)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。
#include #include #include int main() { double N; //把N从int型定义成double型,因为pow()函数不支持int类型,当然,N是int型也可以,用的时候强制转换也行,但是太烦。 int a,t; int i=0,s=0; scanf("%lf",N); //N是double型了,那么赋值就要用%lf啦 a=pow(10,N-1); t=a; while(N=3N=7){ while(pow(10,N-1)=a){ t=a; while(i

C语言 水仙花数
C语言输出水仙花数的具体分析和实现流程如下:
1、水仙花数的含义
“水仙花数”是一个三位数其各位数字的立方和等于该数本身。例如:3^3 + 7^3+ 0^3 = 370
2、算法分析
把给出的某个三位数的个位、十位、百位分别拆分,并求其立方和(设为sum),若sum与给出的三位数相等, 则为“水仙花数”。
3、算法设计
“水仙花数”是一个三位数,可以确定该数的取值范围是 100?999。对应的循环条件如下:
for (n=10; n1000; n++) {}
将n整除以100,得出n在百位上的数字h。
将(n-i*100)整除以10, 得出n在十位上的数字t。
将n对10取余,得出n在个位上的数字a。
求得h,t,a 三个数字的立方和是否与n相等,如果相等则证明该数为水仙花数。
4、代码实现
#include stdio.h
int main() {
int h, t, a, n;
printf("result is:");
for ( n=100; n1000; n++ )? { /*整数的取值范围*/
h = n / 100;
t = (n-h*100) / 10;
a = n % 10;
if (n == h*h*h + t*t*t + a*a*a) ?/*各位上的立方和是否与原数n相等*/
printf("%d ?", n);}
printf("\n");
return 0;}
扩展资料:
常见水仙花数
水仙花数又称阿姆斯特朗数。
1、三位的水仙花数共有4个:153,370,371,407;
2、四位的四叶玫瑰数共有3个:1634,8208,9474;
3、五位的五角星数共有3个:54748,92727,93084;
4、六位的六合数只有1个:548834;
5、七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
6、八位的八仙数共有3个:24678050,24678051,88593477
参考资料来源:百度百科-水仙花数
水仙花数的求取方法(非高精度)
以下为在各种编程语言中实现求取水仙花数的方法(非高精度)。 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),i10^n-1,i++,
If[Total[IntegerDigits^IntegerLength]==i,
Print]]
BASH 脚本实现计算100-999之内数#!/bin/bashfor (( a=1; a10; a++ ))do for (( b=0; b10; b++ )) do for (( c=0; c10; 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 offsetlocal 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!)))
pausenul 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
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出现的次数相等。如果相等,则该数是水仙花数。 #includestdio.h#includestring.h#includevector#includestring#includeiostream#includealgorithmusingnamespacestd;#defineDIGIT21//每次就只用改变这里,就可以算出不同位数的水仙花数了。如果要想算出所用的,这里就写最大,然后再在程序里加一层循环就是咯intCount[10];//Count用来保存枚举是0——9出现的次数,用以和算出来的值各数字出现次数进行对比。intcnt1,num1[10][DIGIT+1][DIGIT+1];//cnt1是符合条件的个数。num1用来保存0——9分别出现0——DIGIT次对应的答案charans[10][DIGIT+1];//保存符合条件的答案//这两个就是为了排序方便一点vectorstringv;strings[10];voiddeal(){intcnt[10];//保存算出来的数0——9出现的次数,用以和Count对比看是否满足条件intno[DIGIT+1];//算出来的数memset(no,0,sizeof(no));memset(cnt,0,sizeof(cnt));for(intk=1;k10;k++){if(num1[k][Count[k]][DIGIT]!=0){return;}for(inti=0;iDIGIT;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;jDIGIT;j++){cnt[no[j]]++;}for(intj=0;j10;j++){if(cnt[j]!=Count[j]){flag=1;break;}}if(!flag){ans[cnt1][DIGIT]='\0';for(intj=0,k=DIGIT-1;jDIGIT;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;i10;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(indexDIGIT-1num1[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;rDIGIT;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+bDIGIT)//保证出现的次数不大于DIGIT,下同{break;}Count[1]=b;for(intc=0;c=DIGIT;c++){if(a+b+cDIGIT){break;}Count[2]=c;for(intd=0;d=DIGIT;d++){if(a+b+c+dDIGIT){break;}Count[3]=d;for(inte=0;e=DIGIT;e++){if(a+b+c+d+eDIGIT){break;}Count[4]=e;for(intf=0;f=DIGIT;f++){if(a+b+c+d+e+fDIGIT){break;}Count[5]=f;for(intg=0;g=DIGIT;g++){if(a+b+c+d+e+f+gDIGIT){break;}Count[6]=g;for(inth=0;h=DIGIT;h++){if(a+b+c+d+e+f+g+hDIGIT){break;}Count[7]=h;for(inti=0;i=DIGIT;i++){if(a+b+c+e+f+g+h+iDIGIT){break;}Count[8]=i;intj=DIGIT-a-b-c-d-e-f-g-h-i;if(j0){break;}Count[9]=j;deal();}}}}}}}}}//排序,将答案从小到大输出sort(v.begin(),v.end());for(inti=0;iv.size();i++){coutv[i]endl;}return0;}
c语言编程调用函数求水仙花数
水仙花数是指一个 n 位数 ( n≥3 ),每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)。
所以可以依次通过模除求得每个位上的值,然后做n次幂后相加,再判断是否与本身相等,从而得到是否为水仙花数的结论。
以求所有三位数水仙花数为例,代码如下,其它相似。
#includestdio.h
#includestdlib.h
#includestdbool.h
int?cube(const?int?n){//计算立方。如果是四位则是四次方,以此类推。
return?n*n*n;
}
int?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;i1000;++i){//对所有三位数判断。
if(isNarcissistic(i))//如果是则输出。
printf("%d\n",i);
}
return?0;
}
求水仙花数。所谓水仙花数,是指一个三位数abc,如果满足a^3+b^3+c^3=abc,则abc是水仙花数。 编写程序
/*
*“水仙花数”算法
*
*作者:gujifly
*
*时间:2010-10-16
*/
#include?"stdafx.h"
#include?"stdio.h"
#include?"time.h"
int?count(int?values,int?times){?//计算单个值的"水仙花"计算结果
int?results=0;
int?i=1;
while?(values/i0)
{
int?tmpp=1;
int?tmp=values%(i*10)/i;
for(int?j=0;jtimes;j++)
{
tmpp*=tmp;
}
results+=tmpp;
i*=10;
}
return?results;
}
void?counts(int?numbers){?//根据给定的位数,调用count计算并输出整个级别的"水仙花"数
int?resultAll=1;
for?(int?j=0;jnumbers;j++)
resultAll*=10;
for(int?i=resultAll/10;iresultAll;i++)
{
if(i==count(i,numbers))
printf("水仙数:%d\n",i);
}
}
int?main(int?argc,?char*?argv[])?//main?函数
{
while?(1)
{
int?x=0;
printf("\n请输入要计算的水仙花位数:\n");
scanf("%d",x);
clock_t?start,?finish;
double?duration;
start?=?clock();
counts(x);
finish?=?clock();
duration?=?(double)(finish-start);
printf("计算所用时间:%f秒\n",duration/1000);
}
return?0;
}
c语言 用两种算法求解所有的水仙花数
#includestdio.h
#includemath.h
#include?stdlib.h?
#includetime.h
#includewindows.h
int?main(void)
{
????double?n,k,t1,t2,t3,ge,shi,bai,qian,wan,shiwan,baiwan,qianwan,yi,shiyi;
????int?i,m,a;FILE?*p;p=fopen("123.txt","a");t1=t2=t3=0;?int?y,b,c,j;
????clock_t?start,finish,zhishi,zhizhong,kkk,mmm;
????k=t1=t2=ge=shi=bai=qian=wan=0;a=i=0;n=3;
????m=9;
????printf("水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。\n");
????printf("例如:153=1^3+5^3+3^3。而本程序将探索9位以内的水仙花数\n");?
????printf("本次运算将会保存结果为123.txt到本程序根目录下\n");
????system("pause");
????kkk=clock();
????onceagain:
????????i=10;a++;
????printf("第%d回合开始:\n",a);?
????printf("本次计算%.0lf位的水仙花数\n",n);
????fprintf(p,"\n%.0lf位水仙花数:",n);
????zhishi=clock();
????for(;;)
????{
????????i++;
????????if(i==11){start=clock();}
????????if(n==3i==11)?{i=100;}?
????????if(n==4i==11)?{i=1000;}
????????if(n==5i==11)?{i=10000;}
????????if(n==6i==11)?{i=100000;}?
????????if(n==7i==11)?{i=1000000;}
????????if(n==8i==11)?{i=10000000;}
????????if(n==9i==11)?{i=100000000;}
????????y=i;k=0;
????????do?{
????????????c=y%10;
????????????y=y/10;
????????????j=1;
????????????b=c;
????????????while(jn)
????????????????{
????????????????b=b*c;
????????????????j++;
????????????????}
????????????k=k+b;
????????????}while(y0);
????????/*ge=?????i/?????????1%?10;
????????shi=????i/????????10%?10;
????????bai=????i/???????100%?10;
????????qian=???i/??????1000%?10;
????????wan=????i/?????10000%?10;
????????shiwan=?i/????100000%?10;
????????baiwan=?i/???1000000%?10;
????????qianwan=i/??10000000%?10;
????????yi=?????i/?100000000%?10;
????????shiyi=??i/1000000000%?10;*/
????????/*k=pow(ge,n)+pow(shi,n)+pow(bai,n)+pow(qian,n)+pow(wan,n);
????????k=pow(shiwan,n)+pow(baiwan,n)+pow(qianwan,n)+pow(yi,n)+pow(shiyi,n)+k;*/
????????/*如上被注释成伪代码的部分是第一代代码,效率低*/
????????if(k==i){finish=clock();t1=(double)(finish-start)/CLOCKS_PER_SEC;start=clock();}
????????if(k==i){printf("%.0lf?算出该答案耗时:%.3lf秒\n",k,t1);}
????????if(k==i){fprintf(p,"\n%.0lf?算出该答案耗时:%.3lf秒",k,t1);}
????????if(n==3?i999){break;}
????????if(n==4?i9999){break;}
????????if(n==5?i99999){break;}
????????if(n==6?i999999){break;}
????????if(n==7?i9999999){break;}
????????if(n==8?i99999999){break;}
????????if(n==9?i999999999){break;}
????}
????zhizhong=clock();t2=(double)(zhizhong-zhishi)/CLOCKS_PER_SEC;
????printf("第%d回合结束,本次运行共耗时%.3lf秒\n\n",a,t2);
????fprintf(p,"\n本次运行共耗时%.3lf秒\n",t2);
????if(nm){n++;goto?onceagain;}
????else
????{mmm=clock();t3=(double)(mmm-kkk)/CLOCKS_PER_SEC;printf("本次程序完成所有任务共耗时%.3lf秒\n",t3);fprintf(p,"\n本次运行共耗时%.3lf秒\n",t3);
????system("pause");
????return?0;}
}
我原创的,不要转载!转载请转载本页面地址!
目前我只会简单粗暴的穷举法,其他的就请另一位大神了。