菜鸟杯的比赛HDU4148

解题思路:看过题就知道是要找规律的,而从下列式子中不难发现,

                       S(1)=1,           //在s(n)从左往右看
                       S(2)=11,          s(1)中有1个1;
                       S(3)=21,          s(2)中有2个1;
                       S(4)=1211,       s(3)中有1个2和1个1;
                       S(5)=111221,   s(4)中有1个1、1个2和2个1;
                       S(6)=312211,   s(5)中有3个1、2个2和1个1;
                       ……

让求s(n)的长度,首先必须找出 s(n)的组成结构,其实仔细一看,会发现s(n)的组成是跟 s(n-1) 密切相关的,过程如上所述。由于 n<=30,数据不大,我就定义了一个二维字符数组来保存s(n)的所有信息,然后就可以求出所需长度。

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 
 5 int main()
 6 {
 7     int i, j, length, k;
 8     int len, sum, n;
 9     char s[31][10000]; 
10     
11     s[1][0] = '1';
12     s[1][1] = '\0'; 
13     for(i=2; i<=30; i++)
14     {
15        len = strlen(s[i-1]);
16        sum = 1;  k = 0;         
17        for(j=0; j<len; j++)
18        { 
19           if(s[i-1][j] == s[i-1][j+1]) sum++;
20           else 
21           {
22              s[i][k] = sum+'0'; 
23              k++;
24              s[i][k] = s[i-1][j];
25              k++; 
26              sum = 1;    
27           }
28        }
29        s[i][k] = '\0';
30     } 
31                   
32     while(scanf("%d",&n) && n)
33     {            
34        printf("%d\n",strlen(s[n]));
35     }
36     return 0;
37 }        
38         

 

 

posted @ 2012-04-17 22:33  zhongya  阅读(132)  评论(0编辑  收藏  举报