[B]Project Euler #14


//もう、いい加減、intの最大値を超える引っ掛け、やめませんか?
//毎度毎度、引っかかってしまうんですが…(笑)

/*
Problem 14 †

正の整数に以下の式で繰り返し生成する数列を定義する。

n → n/2 (n が偶数)

n → 3n + 1 (n が奇数)

13からはじめるとこの数列は以下のようになる。

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
13から1まで10個の項になる。 この数列はどのような数字からはじめても最終的には 1 になると考えられているが、まだそのことは証明されていない(コラッツ問題)

さて、100万未満の数字の中でどの数字からはじめれば一番長い数列を生成するか。

注意: 数列の途中で100万以上になってもよい
*/

#include<iostream>
using namespace std;

#define NumMax 1e6


//---------------------------------------------------------------------->
//コラッツ問題
//---------------------------------------------------------------------->
long long int collatz(long long  int n){

long long int ans;
if ( n % 2) ans =  3 * n + 1;
else{ ans = n / 2; }

if (ans <= 0 ) cout << "\n例外発生\t:n=" << n << "\t ans=" << ans ;

return ans;
}


//---------------------------------------------------------------------->
//main
//---------------------------------------------------------------------->



int main( void ){

long long int sequence;
int NumSequence;
int NumSequenceMax = 0 ;
long long int MaxBegin;

for (int i = NumMax ; i > 1 ; i--){
sequence = collatz( i );
NumSequence = 2;

while( sequence > 1 ){
sequence = collatz( sequence );
NumSequence++;
}

if ( NumSequence > NumSequenceMax ){
NumSequenceMax = NumSequence;
MaxBegin = i;
}

}//next i

cout << "\n 演算終了";
cout << "\n Answer is " << MaxBegin;
getchar();
return 0;
}