プロジェクトオイラー問62

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2062
Problem 62 「立方数置換」 †
立方数 41063625 (345^3) は, 桁の順番を入れ替えると2つの立方数になる: 56623104 (384^3) と 66430125 (405^3) である. 41063625は, 立方数になるような桁の置換をちょうど3つもつ最小の立方数である.

立方数になるような桁の置換をちょうど5つもつ最小の立方数を求めよ.


解法
立法数を桁に0~9の数字が何回あらわれているか写像をとってカウントして、結果が5つならそれが答えです。


#include<stdio.h>
#include<map>
#include<iostream>
#include<set>

struct E{
	__int64 num;
	int count[10];
	bool operator<(const E& e)const{
		for(int i=0;i<10;i++){
			if(count[i]!=e.count[i])return count[i]<e.count[i];
 		}
		return false;
	}
	void set(__int64 num1){
		num=num1;
		for(int i=0;i<10;i++)count[i]=0;
		while(num1>0){
			count[(int)(num1%10)]++;
			num1/=10;
		}
	}
};
 
int main(){
	std::map<E,int> memo;
	__int64 ketaAgari=10;
	E e1;
	std::map<E,int>::iterator it;
	for(__int64 i=1;;i++){
 		__int64 i3=i*i*i;
		e1.set(i3);
		if(ketaAgari<=i3){
			ketaAgari*=10;
			__int64 ans=-1;
			for(it=memo.begin();it!=memo.end();it++){
				if((*it).second==5){
					if(ans==-1||ans>(*it).first.num){
						ans=(*it).first.num;
					}
				}
			}
			if(ans!=-1){
				std::cout<<ans;
				return 0;
			}
			memo.clear();
	}
 		memo[e1]++;
}
}    
最終更新:2014年12月12日 02:14