教你編程拿到小姐姐微信,而後...

最近在某司機羣,偶然有個老司機發了個圖片。 javascript

少奮鬥30年

emmm......這是要走上人生巔峯了嗎? 開始行動,一步一步來。java

一、找到微信號

無論怎麼樣,先找到微信號再說。
小姐姐說了,微信號是由 NY + 數字 組成,其中數字又能夠拆分爲質數ab,且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,而後再判斷 b707829217 / 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,瀏覽器就能夠運行它。
運行方法:打開chrome360瀏覽器firefox搜狗瀏覽器qq瀏覽器 其中一個,按下F12,再進入Console面板,把代碼貼到下方,按下回車,就能夠看到微信號了,微信號:NY866278171
微信號到手了:NY866278171,而後幹嗎呢? 還能幹嗎,固然是作附加題啊算法

二、計算附加題

統計由奇數n組成的序列 1 <= n <= 866278171 的序列,中 3 字符出現的次數。
這不是更簡單了嗎?循環 1866278171的奇數,求它們中含有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

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息