分析:大数模拟和找规律。
#include<iostream> using namespace std; char f[1001][501]; /* 从下面的步骤中可以看出,下一步的后半部分是前一步的整个串,所以对于后半部分有f[n]=f[n-1]; 从前半部分和整体可以看出,另一部分有f[n]=f[n-1]-1(奇数步),f[n]=f[n-1]+1(偶数步)。 step0:1 f[0]=0 step1:01 f[1]=0 step2:10 01 f[2]=1 =2*f[1]+1 step3:0110 1001 f[3]=1 =2*f[2]-1 step4:10010110 01101001 f[4]=3 =2*f[3]+1 step5:0110100110010110 1001011001101001 f[5]=5 =2*f[4]-1 step6:10010110011010010110100110010110 01101001100101101001011001101001 f[6]=11 =2*f[5]+1 最终有f[n]=2*f[n-1]+1(n为偶数),f[n]=2*f[n-1]-1(n为奇数) */ void createtable() { int i,j; int c,fa,sum; memset(f,0,sizeof(f)); for(i=2;i<=1000;i++) { if(i%2==0) { for(j=500,c=0;j>=0;j--) { fa=f[i-1][j]*2+c; f[i][j]=fa%10; c=fa/10; } j=500; sum=f[i][j]+1; f[i][j]=sum%10; c=sum/10; while(c) { sum=f[i][j-1]+c; f[i][j-1]=sum%10; c=sum/10; j--; } } else { for(j=500,c=0;j>=0;j--) { fa=f[i-1][j]*2+c; f[i][j]=fa%10; c=fa/10; } j=500; sum=f[i][j]+-1; if(sum==-1) { f[i][j]=9; c=-1; } else { f[i][j]=sum; c=0; } while(c==-1) { sum=f[i][j-1]+c; if(sum==-1) { f[i][j]=9; c=-1; } else { f[i][j]=sum; c=0; } j++; } } } } int main() { int n,j; createtable(); while(cin>>n) { if(n==1) cout<<"0"<<endl; else { j=0; while(f[n][j]==0) j++; for(;j<=500;j++) putchar(f[n][j]+'0'); putchar('\n'); } } return 0; }
时间: 2024-10-11 21:53:04