Project Euler 36
585 = 1001001001 (2進) は10進でも2進でも回文数である. 100万未満で10進でも2進でも回文数になるような数の総和を求めよ. (注: 先頭に0を含めて回文にすることは許されない.)
Mathematica
ans = 0; For[i = 1, i < 1000000, i++, If[IntegerString[i] == StringReverse[IntegerString[i]] && IntegerString[i, 2] == StringReverse[IntegerString[i, 2]], ans += i, {} ] ] ans
IntegerString[i,2] で2進数にしてくれるのがとにかく強力。この関数を作るのが問題の目的の一つのはずなのに・・・
C/C++
#pragma comment(lib, "mpir.lib") #include <iostream> #include <sstream> #include <string> #include <algorithm> #include <mpir.h> using namespace std; // int型をString型に変換する string IntToString(int num){ stringstream ss; ss << num; return ss.str(); } // numが回文数かどうかを調べる。 bool is_palindromic(int num){ static string str1, str2; str1 = IntToString(num); str2 = str1; reverse(str2.begin(), str2.end()); return str1==str2; } // string型が回文数かどうかを調べる。 bool is_palindromic_str(string str){ string str2; str2 = str; reverse(str2.begin(), str2.end()); return str==str2; } int main(){ int sum=0; mpz_t mp; char c[1000]; string str; mpz_init(mp); for(int i=1 ; i<1000000 ; i++){ if(!is_palindromic(i)) continue; mpz_set_ui(mp, i); mpz_get_str(c, 2, mp); str = c; if(is_palindromic_str(str)) sum+=i; } cout << sum; int end; cin >> end; return 0; }
2進数にするためにmpirを使うのはいろいろ間違ってる気がした。templateなんてワカリマセン