project euler 26~30
26. 少数の循環小数で最長の長さを持つ値を出す
あまりと商が同じときにreturn で返すようにしました
また桁数に応じて10^x 倍しています
int kai(int a,int b){ int now = 1,amari = 0,cnt=0; if(b == 1) now *=10; if(b == 2) now *=100; if(b == 3) now *=1000; vector<pair<int,int> > ve; for(;;){ amari = now%a; now /= a; rep(i,ve.size()) if(ve[i].first == amari && ve[i].second == now) return cnt-i; if(amari == 0) return 0; ve.push_back(make_pair(amari,now)); cnt++; swap(amari*=10,now); } } int solve(int a){ if(a < 11) return kai(a,1); if(a >= 11 && a < 101) return kai(a,2); if(a >= 101) return kai(a,3); } int main(void){ int res=-1,v; REP(i,2,1000){ int a = solve(i); if(res < a){ v = i; res = a; } } cout << v << endl; return 0; }
29. 2<=a<=100,2<=b<=100でa^bをした時にいくつ異なる項が存在するか
#include<boost/multiprecision/cpp_int.hpp> using namespace std; using namespace boost::multiprecision; typedef mp_number<cpp_int_backend<4096, false, void>, false> uint_4096; int main(void){ map<uint_4096,int> ma; for(int i=2;i<=100;i++){ for(int j=2;j<=100;j++){ ma[pow(i,j)]++; } } cout << ma.size() << endl; return 0; }
30. 各桁を5乗して全て足すと元の数の和になる時、それらの値の合計を求めよ
7桁の時 9^5 * 7 で 413343 となり桁が追いつかなくなる
なので6桁までを計測する。
一旦文字列に変えてやっています。
#include<boost/multiprecision/cpp_int.hpp> #include<boost/lexical_cast.hpp> #include<cmath> #define n 1000000 using namespace boost::multiprecision; using namespace boost; bool solve(int a){ string str = lexical_cast<string>(a); int sum=0; rep(i,str.size()){ sum += pow(str[i]-'0',5); } if(sum == a) return true; else return false; } int main(void){ int res = 0; for(int i=2;i<n;i++){ if(solve(i)) res += i; } cout << res << endl; return 0; }