Project Euler 99
指数の形で表される2つの数, 例えば 211 と 37, の大小を調べることは難しくはない. 電卓を使えば, = 2048 < = 2187 であることが確かめられる.
しかし, > を確認することは非常に難しい (両者ともに300万桁以上になる).
各行に1組が書かれている1000個の組を含んだ22Kのテキストファイルbase_exp.txtから, 最大の数が書かれている行の番号を求めよ.
注: ファイル中の最初の二行は上の例である.
#pragma comment(lib,"mpir.lib") #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <mpir.h> using namespace std; vector<string> split(const string& str, const string& delimiter) { // delimiter(2 文字以上も可) を空白に置換 string item(str); for(unsigned pos = item.find(delimiter); pos != string::npos; pos = item.find(delimiter, pos)) { item.replace(pos, delimiter.size(), " "); } // 分解 stringstream buf(item); // 読み取り vector<string> result; while(buf >> item) { result.push_back(item); } return result; } int main(){ vector<int> nums, pows; // ファイル読み込み ifstream ifs("pe099.txt"); string tmp; vector<string> vstr; for(int i=0 ; i<1000 ; i++){ ifs >> tmp; vstr = split(tmp, ","); nums.push_back(atoi(vstr[0].c_str())); pows.push_back(atoi(vstr[1].c_str())); } mpz_t a, maxnum; mpz_init(a); mpz_init_set_ui(maxnum, 0); int k; for(int i=0 ; i<1000 ; i++){ mpz_set_ui(a,nums[i]); mpz_pow_ui(a, a, pows[i]); if(mpz_cmp(a,maxnum)>0){ mpz_set(maxnum, a); k = i; cout << k << endl; } } cout << k << endl; int end; cin >> end; }
工夫ゼロ!