4和7是幸運數字,由它們所組成的數也是幸運數字。例如:44,47,474,7447等等。這一系列幸運數由小到大構成了幸運數列。現在,需要設計乙個演算法找出第n個幸運數是多少。
我們可以將幸運數列分組:
(4,7)(44,47,74,77)(444,447,474,477,744,747,774,777)……
可以看到一位數的幸運數有2個,兩位數的幸運數有4個,三位數的幸運數有8個……n位數的幸運數有2n
個。因此,我們可以先通過迴圈累加確認第n個幸運數是幾位數。
var i =
2, sum=2,
k =1; while (sum
<= n)
console.
log(k)
確定第n個數為k位數之後,我們就可以方便地確定其為第幾個k位數。
var temp = n - (sum
- i);//第temp個k位數
最後,最重要的一步,我們發現:這個幸運數的形式和二進位制類似。通過進一步思考可以發現,將temp轉為二進位制似乎可以解決這個問題,但是需要進行調整,即使用temp-1。
對於n=20,計算後可得,temp=6,temp-1轉換為二進位制後為101,只包含三位數字,因此需要使用0在其高位進行補齊。
function findlucky1(n)
var temp = n - (sum - i) - 1;
var str = temp.tostring(2);
var len = str.length;
for (var j = 0; j < (k - len); j++)
str = str.replace(/0/g, '4');
str = str.replace(/1/g, '7');
return
str;
}console.log(findlucky1(20));//4747
顯然,使用while迴圈確定位數不是乙個最優的方式,可以通過簡單的log求對數的方式來進行確定。
修改後的**如下
function findlucky2(n)
str = str.replace(/0/g, '4');
str = str.replace(/1/g, '7');
return
str;
}console.log(findlucky2(20));//4747
上乙個方法中,使用了for迴圈進行二進位制的高位補齊。那麼還有沒有什麼更簡便的方法來補齊高位呢?顯然是有的。可以使用位運算&來實現,實現方式如下
function findlucky3(n)
console.log(findlucky3(20));//4747
尋找幸運數
今天刷題時,遇到了一道題,我覺得還挺有意思的,自己實現了一下,看了下大佬們的答案,實現如下。首先先來看一下什麼是幸運數 我們一般用的數是十進位制,但是機器只識別二進位制,當乙個整數的十進位制數的每一位,加起來等於它的二進位制的每一位加起來的和。舉個例子吧,123的二進位制表示為1111011,所以二...
尋找幸運數
小綠在紙上寫下自己的號碼,例如 12345,她未來愛人的號碼長度與她的長度相同。第一位數字是介於0到9之間的任乙個,第二個數字是小綠寫下的號碼的第二位和剛剛寫下的第一位數字和的一半。假設小綠寫下第一位是9,算術平均值等於 2 9 2 5.5。她可以根據自己的意願向上或向下取整。她選擇數字5,將結果數...
京東 幸運數
小明同學學習了不同的進製之後,拿起了一些數字做起了遊戲。小明同學知道,在日常生活中我們最常用的是十進位制數,而在計算機中,二進位制數也很常用。現在對於乙個數字x,小明同學定義出了兩個函式f x 和g x f x 表示把x這個數用十進位制寫出後各個數字上的數字之和。如f 123 1 2 3 6。g x...