zoukankan      html  css  js  c++  java
  • 一个js函数算出任意位数的水仙花数

    一个算出任意位数的水仙花数的函数如下:

    var arr =[];
    /*更改num确定取值范围*/
    for(var num = 100; num <= 9999;num++){
    /*多位数版本*/ 
    var i = 0;
    /*设置一个数用来存储变量num*/
    var suan = num;
     
    do{
    /*取出个位*/
    arr[i] = suan%10;
    /*去掉“个位”*/
    suan = Math.floor(suan/ 10) ;
    i++; 
    }while(suan >= 1 )
     
    var sum = 0;
    for(var i=0;i<arr.length;i++)
    {
    /*累加各个数字的n次幂(n为数字的位数,如100为3,1000为4)*/
    sum+= Math.pow(arr[i],arr.length);
    }
    if(sum == num){
    console.log(num);
    }
    }
     

    不过百度上说。。

    水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
    附:其他位数的自幂数名字
    一位自幂数:独身数
    两位自幂数:没有
    三位自幂数:水仙花数
    四位自幂数:四叶玫瑰数
    五位自幂数:五角星数
    六位自幂数:六合数
    七位自幂数:北斗七星数
    八位自幂数:八仙数
    九位自幂数:九九重阳数
    十位自幂数:十全十美数

    不过不管了,要的就是一式多用的功能就行了。

    推导过程如下:

    通常我们求三位数的水仙花是这么算的

     
    for(var i = 100; i < 1000; i++){
      //百位
      var a = Math.floor(i / 100);
      // 十位
      var b = Math.floor((i - a * 100)/10);
      // 个位
      var c = i % 10;
      if(Math.pow(a,3) + Math.pow(b,3) + Math.pow(c,3) === i){
        console.log(i+'是一个水仙花数');
      }
    }
    

     这样的做法似乎没有什么规律,那就先求个位,再求十位,百位

    于是就改成了这样(把循环和累加省掉了)

          
    //个位
    ge = num%10;
    // 十位
    shi = Math.floor(num / 10)  %10;
    // 百位
    bai = Math.floor(num / 100);
    

      也就等价于

    //个位
    ge = num%10;
    // 十位
    shi = Math.floor(num / 10)  %10;
    // 百位,百位/100后余10即等于本身,因为除了100且化为整数之后只剩个位数,个位对10取余依旧是自己
    bai = Math.floor(num / 10/10) % 10;
    

    也就是一直在对10取余之后除以10再对10取余,

    而取余出来时的数为我们所要的个、十、百。。等位数

    除以十则是一直在循环除以同一个数

    那自然取余的数用数组存取,

    而这个用来除以10的数则是循环累除,直至小于1

    于是得到

    var arr =[];
    /*更改num确定取值范围*/
    for(var num = 100; num <= 9999;num++){
    /*多位数版本*/ 
    var i = 0;
    /*设置一个数用来存储变量num*/
    var suan = num;
    
    do{
    /*取出个位*/
    arr[i] = suan%10;
    /*去掉“个位”*/
    suan = Math.floor(suan/ 10) ;
    i++; 
    }while(suan >= 1 )
    
    var sum = 0;
    for(var i=0;i<arr.length;i++)
    {
    /*累加各个数字的n次幂(n为数字的位数,如100为3,1000为4)*/
    sum+= Math.pow(arr[i],arr.length);
    }
    if(sum == num){
    console.log(num);
    }
    }
    

      

  • 相关阅读:
    训练总结
    图论--最短路--SPFA模板(能过题,真没错的模板)
    图论--最短路-- Dijkstra模板(目前见到的最好用的)
    The 2019 Asia Nanchang First Round Online Programming Contest B Fire-Fighting Hero(阅读理解)
    关于RMQ问题的四种解法
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 K题 center
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
    The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
    ZOJ 3607 Lazier Salesgirl (枚举)
    ZOJ 3605 Find the Marble(dp)
  • 原文地址:https://www.cnblogs.com/axu1997/p/11804833.html
Copyright © 2011-2022 走看看