zoukankan      html  css  js  c++  java
  • 在各种编程语言中实现求取水仙花数的方法(非高精度)

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

    PHP “水仙花数”实现代码

    <?php
    for ($i=100;$i<1000;$i++) {
    $m = floor($i/100); //分解出百位
    $n = floor($i/10)%10;//分解出十位
    $k = floor($i%10);//分解出个位
    if ($i == ($m*$m*$m+$n*$n*$n+$k*$k*$k)) {
    echo $i."<br/>";
    }
    }
    ?>

    PHP 所有位数 理论输出

    /** * 水仙花数 为不小于3位的数字,每位数字的N次幂的和等于该数字.N为该数字的位数
    * @name daffodilsNum 水仙花数
    * @param $places 水仙花位数 >=3
    */
    function daffodilsNum($places=3){
    // set_time_limit(0); //设置 脚本超时为不限制,如果提示30秒超时,可以开启本控制
    //$begin= microtime(); // 脚本开始时间
    //定义位数
    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.'<br/>';
    }
    }
    //输出队列
    echo $out;
    //echo "<br/>".(microtime()-$begin); //输出 脚本耗时,当脚本开始时间开启时有效
    }
    else{
    //$this->error('错误的位数'); //提示错误的位数
    }
    }

    语言的"水仙花数"实现代码

    #include <stdio.h>
    int main()
    {
    int i,d1,hub,transit;
    for(i=100;i<=9999;++i)
    {
    for(hub=0 ,transit=i,d1=123; transit!=0;)
    {
    d1=(transit%10)*(transit%10)*(transit%10);
    /*
    多位数需要多添加一个循环 懒得改了 怪我手滑
    */
    hub=hub+d1;
    transit=transit/10;
    }
    if(hub==i) printf("水仙花数%d\n",i);
    }
    return 0;
    }

    PASCAL 实现代码

    program shuixianhuashu;
    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 sxh;
    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 abcd;
    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.

    Visual Basic 的"水仙花数"实现代码

    Private Sub Command2_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
    Next i
    End Sub

    FORTRAN 的"水仙花数"实现代码

    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,IC
    10 CONTINUE
    20 FORMAT(5X,4I4)
    30 FORMAT(5X,18HN=I**3+J**3+K**3)
    STOP
    END

    C++ 编译器上的水仙花数实现代码

    #include<iostream>
    using namespace std;
    int main()
    {int a,q,w,e;
    for(a=100;a<1000;++a)
    {q=a/100;
    w=(a-q*100)/10;
    e=(a-q*100-w*10);
    if(a==q*q*q+w*w*w+e*e*e)
    cout<<a<<"是水仙花数"<<endl;};
    return 0;
    }

    python 中实现的代码

    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*i*i+j*j*j+k*k*k:
    print i*100+j*10+k

    Java 中实现的代码

    public class NumberOfDaffodils {
    public static void main(String[] args) {
    List<Long> numbers = new ArrayList<Long>();
    for(long i = 100; i < Long.MAX_VALUE ; i++){
    if(match(i)){
    numbers.add(i);
    }
    }
    System.out.println(numbers);
    }
    private static boolean match(long in) {
    //统计位数
    int count = (in+"").length();
    //记录每位数字
    long temp = 0;
    //辗转取余的保存数
    long num = in;
    //求和数
    long sum = 0;
    for(int i = count ; i > 0 ; i--){
    temp = num/(long)Math.pow(10,i-1);
    num = num%(long)Math.pow(10,i-1);
    sum+=Math.pow(temp,count);
    }
    return in == sum;
    }
    }

    C# ASP.N 中的实现代码

    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;
    }

    javascript +html 实现可变位数的运算

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    <script type="text/javascript">
    function fun(){
    //取得参量位数
    var valnum=parseInt(document.frm.input.value);
    //求得符合参量位数的最大值和最小值
    var highnum=Math.pow(10,valnum)-1;
    var lownum=Math.pow(10,valnum-1);
    //输出队列的组成部分
    var output="共有个数:",res_str="";
    //a为i分解为 数组的下脚值,num为符合规则的水仙花的个数
    var a=0,num=0;
    //遍历所有符合参量位数的数
    for(i=lownum;i<=highnum;i++){
    //res为水仙花数规则值,即n位的数的每位数的n次幂的和,预置为0
    var res=0;
    //分解出当前i的每位数并存如 数组
    var new_i=i.toString().split("");
    for(a=0;a<=valnum-1;a++){
    //求得水仙花数 规则
    res=Math.pow(parseInt(new_i[a]),valnum)+res;
    }
    //判断符合水仙花数的个数,如符合则将水仙花数并入输出队列
    if(res==i){
    num++;
    res_str=res_str+"<br>"+res;
    }
    }
    //输出队列
    if(valnum<3){output="你输入了无效位数!";}
    else{output=output+num+res_str;}
    //输出
    document.getElementById("divnum").innerHTML=output;
    }
    </script>
    </head>
    <body><form name="frm">
    <label>请输入水仙花的位数(N>=3):</label><input type="text" name="input" value="">
    <input value="运算" type="button" onclick="fun()" />
    </form>
    <div id="divnum" style=" position:absolute;left:100px;200px;top:100px;"></div>
    </body>
    </html>

    asp 中实现的代码

    <%
    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.
    QBASIC水仙花数1—999999之间
    CLS
    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
    END

    PB 实现的方法(只计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

    ActionScript实现的方法(只计3位数)

    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);
    }
    }
    }
    }

    Delphi实现的方法(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))
    end
    end;

    MATLAB中实现的方法(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
    或者:

    Mathematica实现方法(可现不定位数解)

    n=Input["请输入大于2的自然数n:"];
    For[i=10^(n-1),i<10^n-1,i++,
    If[Total[IntegerDigits^IntegerLength]==i,
    Print]]

    添加一种C++的算法

    #include<iostream>
    #include<cmath>
    using namespace std;
    void main()
    {int a,b,c,e,f,g;
    double d;
    b=1;
    f=0;
    a=100;
    e=0;
    c=g=a;
    A:do
    {
    a/=10;
    b++;}
    while(a>10);
    do{d=g%10;
    g/=10;
    e+=pow(d,b);
    f++;}
    while(f!=b+1);
    if(e==c)
    {cout<<c<<"\n";
    c++;
    a=g=c;
    b=1;
    f=0;
    e=0;
    goto A;}
    else
    {c++;
    a=g=c;
    b=1;
    f=0;
    e=0;
    goto A;}}

    BASH 脚本实现计算100-999之内数

    #!/bin/bash
    for (( 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 "Found number $number1"
    fi
    done
    done
    done

    易语言代码 求指定范围内水仙花数

    .版本 2
    .子程序 取出水仙花数, 整数型, , 返回范围内水仙花数个数,如果范围过大将会十分耗时
    .参数 起始数字, 整数型, , 从此数开始判断是否为水仙花数
    .参数 结束数字, 整数型, , 此数必须大于起始数字
    .参数 保存得到水仙花数的数组, 整数型, 可空 数组
    .局部变量 数字数组, 文本型, , "0"
    .局部变量 水仙花数, 整数型, , "0"
    .局部变量 总和, 整数型
    .局部变量 计次, 整数型
    .局部变量 计次2, 整数型
    .如果真 (起始数字 > 结束数字)
    清除数组 (保存得到水仙花数的数组)
    返回 (0)
    .如果真结束
    .变量循环首 (起始数字, 结束数字, 1, 计次)
    .计次循环首 (取文本长度 (到文本 (计次)), 计次2)
    加入成员 (数字数组, 取文本中间 (到文本 (计次), 计次2, 1))
    处理事件 ()
    .计次循环尾 ()
    .计次循环首 (取数组成员数 (数字数组), 计次2)
    总和 = 总和 + 求次方 (到数值 (数字数组 [计次2]), 取文本长度 (到文本 (计次)))
    处理事件 ()
    .计次循环尾 ()
    .如果真 (总和 = 计次)
    加入成员 (水仙花数, 计次)
    .如果真结束
    处理事件 ()
    .变量循环尾 ()
    保存得到水仙花数的数组 = 水仙花数
    返回 (取数组成员数 (水仙花数))

    vb代码 判断水仙花数

    Dim a() As Integer
    n = InputBox("请输入一个n位正整数" & Chr(10) & "n大于等于3", "水仙花数", 153)
    Dim i As Integer
    m = Len(n)
    ReDim a(1 To m) As Integer
    For i = 1 To m
    a(i) = Val(Mid(n, i, 1))
    Next i
    For i = 1 To m
    s = a(i) ^ m + s
    Next i
    If s = Val(n) Then
    MsgBox "是水仙花数"
    Else
    MsgBox "不是水仙花数"
    End If
    再加一种C语言方法:
    //水仙花数
    #include <stdio.h>
    #include <math.h>
    int main()
    {
    unsigned long fr,to,n,m,k,sum;
    int nLog,numlen,brPoint=1;
    //输入100~约4000000000(unsigned long)间的范围
    printf("Input Number Range ('from' 'to'):"); scanf("%lu %lu",&fr,&to);
    for(n=fr;n<=to;n++)
    {
    //算出n有多少位
    nLog = log10(n);
    numlen = floor(nLog)+1;
    //数n 的各位数字 的位数次幂 的和
    m=n;
    sum=0;
    while(m>0)
    {
    k=m%10;
    sum+=pow(k,numlen);
    m=m/10;
    }
    //若是水仙花数,输出。每行5个
    if(sum==n)
    {
    printf("%12lu",n);
    if(brPoint%5==0)
    {
    printf("\n");
    brPoint=0;
    }
    brPoint++;
    }
    }
    return 0;
    }

    FreeBasic实现100~999之间的水仙花数

    FOR I=100 TO 999
    A=I\100
    B=I\10 MOD 10
    C=I MOD 10
    IF A*A*A+B*B*B+C*C*C=I THEN PRINT I:S=S+1
    NEXT I
    PRINT S
    SLEEP
    END
    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 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
  • 相关阅读:
    【转】框架集中framespacing、border和frameborder属性的关系
    使用ArcGIS GP服务之二手工建模
    使用ArcGIS GP服务之五 JavaScript的调用
    使用ArcGIS GP服务之三发布前的准备
    计算GPS WGS_84 两点的距离
    使用ArcGIS GP服务之四GP服务发布
    计算GPS WGS_84 两点的距离 更加细腻的算法
    QueryPerformanceFrequency
    cocos2dx App 图标
    cocos2dx CCTimer::timerWithTarget回调
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3087252.html
Copyright © 2011-2022 走看看