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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2014
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<stdio.h> 

const int LIMIT=1000*1000;
int len[LIMIT]={0};

int calc(__int64 n){
	if(n<LIMIT && len[(int)n]>0){
 		return len[(int)n];
 	}else{
		int l=calc(n%2==0?n/2:3*n+1)+1;
		if(n<LIMIT)len[(int)n]=l;
		return l;
	}
}

int main(){
	int ans,maxLen=0;
	len[1]=1;
	for(int i=1;i<LIMIT;i++){
 		len[i]=calc(i);
		if(len[i]>maxLen){
			maxLen=len[i];
			ans=i;
 		}
	}
	printf("%d\n",ans);
}
最終更新:2014年11月16日 10:06