zoukankan      html  css  js  c++  java
  • js算法集合(一) 水仙花数 及拓展(自幂数的判断)

    js算法集合(一)

                    最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,希望能对大家有所帮助。

       
       
      1、验证一个数是否为水仙花数
        ①要写水仙花数的算法,我们首先来了解一下什么是水仙花数,水仙花数是指一个 3位正整数 ,它的每个位上的数字的 3次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153);
        ②了解了什么是水仙花数我们就开始分析该怎么下手。通过定义来看我们首先要把每一位数都取出来,然后通过验证等式是否成立来找出水仙花数;
        ③那么怎么去取到一个三位数的每一位呢,很简单,还是拿153来做例子吧,153%10取余为1将个位取出来,然后153%100取余,然后除以10取整,获得十位,153/100取整获得百位数;
        ④拿到了三位数怎么去判断呢,通过if判断语句来判断1^3 + 5^3+ 3^3 = 153是否成立,成立打印出来。我们先写一个判断水仙花数的代码:
          
     1         while (true){
     2         var num=Number(prompt('请输入一个三位数'));
     3          if(num<1000&num>=100){
     4             var a=num%10;                  //个位数
     5             var b=parseInt(num%100/10);    //十位数
     6             var c=parseInt(num/100);       //百位数
     7             }else {
     8              alert('输入错误;');
     9              continue;
    10          }
    11             if(num==a*a*a+b*b*b+c*c*c){
    12                 alert(num+"是水仙花数");
    13                 break;
    14             }else {
    15                 alert(num+"不是是水仙花数");
    16                 break;
    17             }
    18         }

      2、打印出所有的水仙花数   

        ①我们已经知道了怎么去判断一个数是否是水仙花数,那么怎么去打印所有的水仙花数呢,第一个想到的一定是循环。

        ②既然水仙花数是一个三位数,那么我们只要把所有的三位数判断一下就可以了,话不多说,看代码:

        

    1  document.write('水仙花数有:')
    2          for(var num=100;num<1000;num++){
    3             var a=num%10;                  //个位数
    4             var b=parseInt(num%100/10);    //十位数
    5             var c=parseInt(num/100);       //百位数
    6             if(num==a*a*a+b*b*b+c*c*c){
    7                document.write(num+',')
    8             }
    9         }

       3、自幂数的算法,我们把水仙花数拓展一下,来做一做自幂数的算法;

        ①首先还是先了解一下什么是自幂数,自幂数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153);

        ②水仙花数只是自幂数的一部分,从水仙花数拓展,判断一个数是否是自幂数,首先要判断它是一个几位数

        ③然后取到数的每一位,来进行判断,以1634为例,具体的请看代码注释:

     1    while (true) {
     2             var num = Number(prompt('请输入一个大于100的数'));
     3             if (num >= 100 && parseFloat(num) == parseInt(num)) {
     4                 var i = 100;
     5                 var count = 0, sum = 0, a;
     6                 /*判断num是几位数*/
     7                 while (true) {
     8                     if (num / i >= 1) {
     9                         i *= 10;
    10                         count++;      //count = 1;时,为3位数,2时为四位数;   以1634为例:count=2
    11                     } else {
    12                         i /= 10;         //进到这里时num<i,除以10跟num同位数;  以1634为例:i=1000
    13                         break;
    14                     }
    15                 }
                 /*取到每一位并计算每位数几次幂之和*/
    16 while (i >= 1) { 17 var b = 1; 18 a = parseInt(num % (i * 10) / i); //取到num的每一位, 取千位为 1634/1000取整; 百位:1634%1000/100取整 十位:1634%100/10取整 个位1634%10;
                                         //百位和十位的规律都是 1634%(i*10)/i取整;同时对千位和个位进行试验,1634%10000=1634;1634%10/1;依旧成立 19 for (var j = 1; j <= count + 2; j++) { 20 b *= a; //根据位数,来决定每位数的几次幂 21 } 22 sum += b; //对每位数的几次幂进行求和; 23 i/=10; //更新循环变量取下一位 24 }
                 /*判断是否为自幂数*/
    25 if (num == sum) { 26 alert(num + "是自幂数"); 27 break; 28 } else { 29 alert(num + "不是是自幂数"); 30 break; 31 } 32 } else { 33 alert('输入错误;'); 34 continue; 35 } 36 }

       

     
    本次分享就到这里

       谢谢大家的观看   

     
    觉得不错请点赞
     

    希望能对大家有所启发

    有更好的方法或不同的意见请在留言区跟我交流

      

  • 相关阅读:
    [hdu 2089]简单数位dp
    [fzu 2271]不改变任意两点最短路至多删的边数
    [bzoj 1143]最长反链二分图最大匹配
    [codeforces gym Matrix God]随机矩阵乘法
    [hdu 2298] 物理推导+二分答案
    url编码有个bug,不能直接用decodeURIComponent,如果遇到前面的$会报错。
    设置cookie的保存时间 下一篇
    js操作获取和设置cookie
    简单使用location.hash的方法 ,怎么做,有什么用? 简单的js路由页面方法。
    三个月之内开发项目最好用第三方库
  • 原文地址:https://www.cnblogs.com/zheshiyigemanong/p/6854279.html
Copyright © 2011-2022 走看看