哇~ 大家似乎都是用數學方程式去解;
我數學不好, 只能用邏輯的方式去土法煉鋼,
不過我也公佈一下我的算法吧:
假設某數為XXXXXX....XXX2,
而將2移到最左邊後就會是兩倍,
也就是2XXXXX...XXX4,
那麼就能得知某數是XXXXXX...XX42,
將某數兩倍後, 就是 2XXXXX...XX84,
那就又能得知某數為XXXXXX...X842
以此類推, 就能找出一個pattern,
也就是某數的某一位數,
必定是前一位數乘以2後取"個位數",
加上前兩位數乘以2後取"十位數" (也就是0或1);
以上的pattern可以寫成: Ax = ([Ax-1] * 2 mod 10) + carry of ([Ax-2] * 2)
Ax = 某數的某一位數
[Ax-1] = 某數的某一位數的前一位數
[Ax-2] = 某數的某一位數的前兩位數
然後只要算到 Ax = 1 而且 carry = 0,
答案就出來了... ^^"
用手算是很久的 (想出pattern 加演算共花了我近三十分鐘...)
不過我也寫了個Java程式,
倒是蠻快的... ^^"
程式公佈出來, 敬請指教:
- public class Counter {
- public static void main(String[] args) {
- int m = 2, r = 4, c = 0; //r = remainder, c = carry
- String s = "";
- while (true) {
- r = m * 2 % 10 + c;
- c = m > 4 ? 1 : 0;
- s = Integer.toString(m) + s;
- if (m == 1 && r == 2) {
- break;
- } else {
- m = r;
- }
- }
- System.out.println(s);
- }
- }
複製代碼 |