Hduoj1865 【大数斐波那契】【水题】

/*Problem E 
Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 41   Accepted Submission(s) : 12
Font: Times New Roman | Verdana | Georgia 
Font Size: ← →
Problem Description
You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ‘2’, or leave the ‘1’ there. Surly, you may get many different results. For example, given 1111 , you can get 1111, 121, 112,211,22. Now, your work is to find the total number of result you can get.

Input
The first line is a number n refers to the number of test cases. Then n lines follows, each line has a string made up of ‘1’ . The maximum length of the sequence is 200.

Output
The output contain n lines, each line output the number of result you can get .

Sample Input
3
1
11
11111

Sample Output
1
2
8
*/
#include<stdio.h>
#include<string.h>
int main()
{
	int i , j, k, n, m, a[1000], b[1000], c[1000];
	char s[205];
	scanf("%I64d", &n);
	getchar();
	while(n--)
	{
		int la = 1, lb = 1,lc = 1;
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));
		gets(s);
		m = strlen(s);
		if(m == 1 || m == 2)
		{
			printf("%d\n", m);
			continue;
		}
		a[0] = 1;
		b[0] = 2;
		for(i = 3; i <= m; i++)
		{
			memset(c, 0, sizeof(c));
			for(j = 0;  j < lb; j++)
			{
				c[j] += b[j] + a[j];
				if(c[j] > 9)
				{
					c[j+1] += c[j] / 10;
					c[j] %= 10;
				}
			}
			if(c[lc] > 0)
			lc++;
			for(k = 0; k < lb; k++)
			{
				a[k] = b[k];
				la = lb;
			} 
			for(k = 0; k < lc; k++)
			{
				b[k] = c[k];
				lb = lc;
			}
		}
		for(i = 0; i < lb; i++)
		printf("%d", b[lb-1-i]);
		printf("\n");
	}
	return 0;
}


题意:求题目要求的数列的种类数。

思路:找出4,6,7个1时的种类数,归纳总结出数列的规律。

关键:发现斐波那契。

你可能感兴趣的:(c)