そのまま割っていくだけです。
計算時間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