菜鸟杯的比赛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