最近在某司機羣,偶然有個老司機發了個圖片。 javascript
emmm......這是要走上人生巔峯了嗎? 開始行動,一步一步來。java
無論怎麼樣,先找到微信號再說。
小姐姐說了,微信號是由 NY + 數字
組成,其中數字
又能夠拆分爲質數a
和b
,且a>b
,再且a * b = 707829217
。
emmm......筆算幾乎沒法下手,只能用機器算了。老老實實幹吧,畢竟關係到小姐姐的幸福。
開工:先把小於 707829217 的質數都找出來,而後嵌套循環找出知足a * b = 707829217
的兩個質數,So easy!
程序寫好後,運行,emmm......計算機不給力,過了幾分鐘沒有出結果。
檢討一下,這個算法的時間複雜度是O(n * logn)
(總之很慢就是了),不知道 707829217
這個以億爲單位的數,要算多久。並且把每個質數都儲存下來,這個內存空間消耗也很大。速度慢,空間大,這怎麼行,咱們的目標是更快、更小 。
再想一想,a * b = 707829217
,也就是 a = 707829217 / b
啊。只要找到 一個能夠把707829217
整除的b
,而後再判斷 b
和707829217 / b
是否是質數就好了,這樣就不須要判斷每一個數是否是質數了。算法分析 傳送門:將n分解爲2個質數的乘積 git
javascript代碼:github
const isPrime = function (n) { if (n < 2) { return false; } const max = Math.sqrt(n); for (let i = 3; i < max; i = i + 2) { if (n % i === 0) { return false; } } return true; }; const find2number = function (n) { const max = Math.sqrt(n); for (let b = 2; b <= max; b++) { if (n % b === 0) { if (isPrime(b)) { const a = n / b; if (isPrime(a)) { return [a, b]; } } } } return false; }; const r = find2number(707829217); console.log("微信號:NY"+r[0]+r[1]); // 微信號:NY866278171
由於是javascript
,瀏覽器就能夠運行它。
運行方法:打開chrome
、360瀏覽器
、firefox
、搜狗瀏覽器
、qq瀏覽器
其中一個,按下F12
,再進入Console
面板,把代碼貼到下方,按下回車
,就能夠看到微信號了,微信號:NY866278171
。
微信號到手了:NY866278171,而後幹嗎呢? 還能幹嗎,固然是作附加題啊。算法
統計由奇數n
組成的序列 1 <= n <= 866278171
的序列,中 3
字符出現的次數。
這不是更簡單了嗎?循環 1
到 866278171
的奇數,求它們中含有3
字符的個數的和,ez !
運行:2分鐘後,獲得答案:441684627。
答案是有了,但是爲何這麼慢。這麼簡單的問題,其餘小哥哥必定也能答出來。這樣不行,必定要作到最快。
仔細分析,能夠把問題轉化成:求小於等於n
的奇數序列中3
分別在個
、十
、百
、千
等位數上出現的次數的和。
此算法分析過程稍微長,給有興趣瞭解算法細節的小哥哥一個 傳送門:求奇數序列中x出現的次數 chrome
這裏直接上 javascript 代碼:瀏覽器
const count2 = function (n, x) { let sum = 0, factor = 1, higher = 0, current = 0, lower = 0, time = 1; for (; Math.floor(n / factor) != 0; factor *= 10) { higher = Math.floor(n / (factor * 10)); current = Math.floor((n / factor)) % 10; lower = n - Math.floor((n / factor)) * factor; if (factor > 1) { time = 0.5; } else if (x % 2 === 0) { continue;} if (x === 0) { higher--; } if (current === x) { let _t = factor === 1 ? 1 : Math.ceil(lower * time); sum += higher * factor * time + _t; } else if (current > x) { sum += (higher + 1) * factor * time; } else if (current < x) { sum += higher * factor * time; } } return sum; }; console.log("附加題:" + count2(866278171,3)); // 附加題:441684627
運行,程序輸出了附加題:441684627
。微信
題目都解出來了,這就開始加微信,打開微信,搜索NY866278171
,添加到通信錄,驗證信息:附加題答案:441684627
。仔細想一想,這樣怎麼能體現個人算法更優越呢?因而補加上一句:不到0.01秒完事。想一想我還真機智。spa