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なんてワカリマセン