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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20230
フィボナッチ数列のルールで生成される数字列の指定された番目の数字を拾っていく問題。


そのまま割っていくだけです。
計算時間1秒。

#include<stdio.h>
#include<iostream>
#include<stack> 

char As[101]="1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";
char Bs[101]="8214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196";



std::stack<char> ans;
const int SEED=100;

void calc(__int64 n){
	__int64 fina[200];
	fina[1]=SEED;
	fina[2]=SEED;
	int p=3;
	while(1){
		fina[p]=fina[p-1]+fina[p-2];
		if(n<=fina[p])break;
		p++;
	}
	
	while(p>2){
		if(n<=fina[p-2]){
			p-=2;
		}else{
			n-=fina[p-2];
			p-=1;
		}
	}
	std::cout<<"\np="<<p<<" n="<<n<<" ";
	if(p==2){
		printf("b%c",Bs[(int)n-1]);
		ans.push(Bs[(int)n-1]);
	}else{
		printf("a%c",As[(int)n-1]);
		ans.push(As[(int)n-1]);
	}
	
} 

int main(){
 	__int64 p7=1;
	for(__int64 i=0;i<=17;i++){
		calc((127+19*i)*p7);
		p7*=7;
	}
 	printf("\n\n");
	while(!ans.empty()){
		char c=ans.top();
		ans.pop();
		printf("%c",c);
	}
	printf("\n");
}
最終更新:2015年11月22日 04:55