Project Euler 16
2^15 = 32768 であり、これの各数字の合計は 3 + 2 + 7 + 6 + 8 = 26 となる。 同様にして、2^1000 の各数字の合計を求めよ。
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); }
かなりましになった!