Project Euler 99

指数の形で表される2つの数, 例えば 211 と 37, の大小を調べることは難しくはない. 電卓を使えば, 2^{11} = 2048 < 3^7 = 2187 であることが確かめられる.

しかし, 632382^{518061} > 519432^{525806} を確認することは非常に難しい (両者ともに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;
}

工夫ゼロ!