Hduoj1041【数学】

/*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,控制相加的上限,避免超时。

你可能感兴趣的:(Hduoj1041【数学】)