Computer Transformation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6895 Accepted Submission(s): 2499
How many pairs of consequitive zeroes will appear in the sequence after n steps?
2 3
1 1
题意:电脑的内存首先是初始化为1.经过一段时间,变成0 和1。接着分别0变为 10,1又变为01。意思就是(1->0 1)(0->1 0)问经过n步。出现相邻的两个零的个数。
分析:
此题,很明显就是找规律,不可能去模拟。多画几个,就大致可推出方程了。
(1,0) ,(2,1),(3,1),(4,3),(5,5),(6,11)………(说明:第一个数代表步数,第二个出现两个零的个数)
规律:
其递归方程为: f(n)=f(n-1)+2*f(n-2).
从第四项开始:f(n)=2^k+f(n-2)(n=4,5,6....)(k=1,2,3,4....)
step4 : 3 =2^1+1
step5 : 5 =2^2+1
step6: 11=2^3+3
写的过程中发现每步的数字增加了2^n的数据,数据非常大,考虑到应该是道大数的题目,最后在大神的指导下,找到了个很巧妙的方法,开了两个数组,一个用来存取连续0的个数,一个用来递增过渡相加。
代码:
#include<stdio.h>
#define MAX 1000
int n[MAX][400]={{0},{0},{1},{1}}; //前四项初始化
int b[MAX]={1};
void maxn(){
int i,j,k,z;
for(i=4;i<=MAX;i++){
for(j=0,k=0,z=0;j<400;j++){
b[j]=2*b[j]+k; //数组b存取2^n,降位存取。
k=b[j]/10;
b[j]=b[j]%10;
n[i][j]=b[j]+n[i-2][j]+z;//数组n存取连续字段0的个数,降位存取。
z=n[i][j]/10;
n[i][j]=n[i][j]%10;
}
}
}
int main(){
int i,N,flag;
maxn();
while(~scanf("%d",&N)){
flag=0;
if(N==1)
printf("0");
else if(N==2 ||N==3)
printf("1");
else
for(i=399;i>=0;i--){
if(n[N][i] || flag){
printf("%d",n[N][i]);
flag=1;
}
}
printf("\n");
}
return 0;
}