/*Computer Transformation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6626 Accepted Submission(s): 2408
Problem Description
A sequence consisting of one digit, the number 1 is initially written into a computer. At each successive time step, the
computer simultaneously tranforms each digit 0 into the sequence 1 0 and each digit 1 into the sequence 0 1. So, after the
first time step, the sequence 0 1 is obtained; after the second, the sequence 1 0 0 1, after the third, the sequence
0 1 1 0 1 0 0 1 and so on.
How many pairs of consequitive zeroes will appear in the sequence after n steps?
Input
Every input line contains one natural number n (0 < n ≤1000).
Output
For each input n print the number of consecutive zeroes pairs that will appear in the sequence after n steps.
Sample Input
2
3
Sample Output
1
1
Source
Southeastern Europe 2005
Recommend
JGShining | We have carefully selected several similar problems for you: 1006 1143 1200 1063 1046
*/
#include<stdio.h>
#include<string.h>
int g[301], f[301];//g[i]表示第i步所拥有的1的个数,f[i]表示第i步所拥有的0的对数
//第1000个数接近300位
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
f[0] = 0;//the first
g[0] = 1;//the second
if(n == 1 || n == 2)
{
printf("%d\n", n-1);
continue;
}
for(int i = 3; i <= n; ++i)
{
int temp;
for(int j = 0; j < 301; ++j)//f*2
{
f[j] *= 2;
temp = f[j] + g[j];
f[j] = g[j];
g[j] = temp;
}
for(int j = 0; j < 301; ++j)
{
if(g[j] > 9)
{
g[j+1] += g[j]/10;
g[j] %= 10;
}
}
}
for(int i = 301; i >= 0; --i)
{
if(g[i] != 0)
{
for(int j = i; j >= 0; --j)
printf("%d", g[j]);
printf("\n");
break;
}
}
}
return 0;
}
题意:给出一个数1,每进行一次操作,数列中的1会变成01, 而0会变成10,求经过n步操作后,数列中00的对数。
思路:这个是个规律题,通过推敲可以发现f【i】 = f【i-1】 + f【i-2】*2,然后就是大数相加,其次要把握好第1000个数的长度是300,控制相加的上限,避免超时。