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 }

   

 
本次分享就到這里

   謝謝大家的觀看   

 
覺得不錯請點贊
 

希望能對大家有所啟發

有更好的方法或不同的意見請在留言區跟我交流

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM