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;
}