Original

The decimal number, 585 = 1001001001 (binary), is palindromic in both bases.

Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2.

(Please note that the palindromic number, in either base, may not include leading zeros.)

和訳

585 = 1001001001 (2進) は10進でも2進でも回文数である.

100万未満で10進でも2進でも回文数になるような数の総和を求めよ.

(注: 先頭に0を含めて回文にすることは許されない.)

当てにならないソースコード(C#)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;

namespace ProjectEuler {
    class Problem36 : Problem{
        public Problem36() {
            long answer = 0;
            SortedList<long, bool> dec = new SortedList<long, bool>();
            for (long i = 1; i<1000; i++) {
                List<int> digits = Numerics.MakeDigits(i);
                for (int j = digits.Count-2; j >= 0; j--) {
                    digits.Add(digits[j]);
                }
                dec.Add(Numerics.FromDigits(digits), true);

                digits = Numerics.MakeDigits(i);
                for (int j = digits.Count - 1; j >= 0; j--) {
                    digits.Add(digits[j]);
                }
                dec.Add(Numerics.FromDigits(digits), true);
            }
            foreach (var d in dec) {
                if (IsBinaryPalindromic(d.Key)) {
                    answer += d.Key;
                    //Console.WriteLine(d.Key);
                }
            }
            Console.WriteLine("> " + answer);
        }

        bool IsBinaryPalindromic(long n) {
            long input = n,
                 reversed = 0;
            while (n != 0) {
                reversed <<= 1;
                if ((n & 1) == 1) {
                    reversed |= 1;
                }
                n >>= 1;
            }
            return input == reversed;
        }
    }
}