Project Euler 16

2^15 = 32768 であり、これの各数字の合計は 3 + 2 + 7 + 6 + 8 = 26 となる。

同様にして、2^1000 の各数字の合計を求めよ。

Mathematica

Total[IntegerDigits[2^1000]]

これも桁数を考慮してプログラミングする問題なのですが、Mathematicaだとそのまんまです。

C/C++

#pragma comment(lib,"mpir.lib")
#include <iostream>
#include <string>
#include <mpir.h>
#include <cstdio>
#include <cstdlib>

using namespace std;

int main(){

	mpz_t a;
	mpz_init_set_ui(a, 1);

	for(int i=0 ; i<1000 ; i++){
		mpz_mul_ui(a, a, 2);
	}

	FILE *fp;
	int c;
	fp = fopen("tmp.txt","w");

	// aの値をfpに入れる 
	mpz_out_str(fp, 10, a);
	fclose(fp);

	int k=0;

	// もう1回読み込む。絶対無駄なことしてるよね
	fp = fopen("tmp.txt","r");
	while((c = fgetc(fp)) !=EOF){
		k += c-48;
	}

	cout << k << endl;
	fclose(fp);
}

mpir(多倍長演算ライブラリ)に関してはProject Euler 3の記事をご参照ください。
一度書き込んで閉じて、それをもう1回読むというよくわからないことをやるはめに。
fstreamとか使おうとしたんだけど、mpirで計算した値を出力する mpz_out_strが FILE* を引数として要求しているのでこういう形になりました・・・
うーん、よくわかってない。

追記
#pragma comment(lib,"mpir.lib")
#include <iostream>
#include <string>
#include <mpir.h>
#include <cstdio>
#include <cstdlib>

using namespace std;

int main(){

	mpz_t a, k, tmp;

	//a=1;
	//k=0;
	//tmp=0;
	mpz_init_set_ui(a, 1);
	mpz_init_set_ui(k, 0);
	mpz_init_set_ui(tmp, 0);

	for(int i=0 ; i<1000 ; i++){
		//a*=2;
		mpz_mul_ui(a, a, 2);
	}

	while(mpz_cmp_si(a,0)!=0){
		// tmp = a%10;
		mpz_mod_ui(tmp, a, 10);
		// k += tmp;
		mpz_add(k, k, tmp);
		// a = a/10;
		mpz_div_ui(a, a, 10);
	}

	// cout << k << endl;
	mpz_out_str(stdout,10, k);
}

かなりましになった!