HDOJ 题目18651sting(大数 斐波那契)

来源:互联网 发布:mac怎么写入移动硬盘 编辑:程序博客网 时间:2024/05/29 17:35

1sting

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3191    Accepted Submission(s): 1223


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
311111111
 

Sample Output
128
 

Author
z.jt
 

Source
2008杭电集训队选拔赛——热身赛
 


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1865

 

ac代码

#include<stdio.h>   #include<string.h>   int a[1001][10000];  char * add(char a[],char b[],char c[])  {      int len1,len2,i,j,t[10000],max,k=0;      len1=strlen(a);      len2=strlen(b);      i=len1-1;      j=len2-1;  memset(t,0,sizeof(t));      while(i>=0||j>=0)      {          if(i<0&&j>=0)              t[k]+=b[j]-'0';          else              if(j<0&&i>=0)                  t[k]+=a[i]-'0';              else              {                  t[k]+=a[i]-'0'+b[j]-'0';              }  k++;  t[k]+=t[k-1]/10;  t[k-1]%=10;  if(t[k])  max=k;  else  max=k-1;  i--;  j--;      }      for(i=max;i>=0;i--)          c[max-i]=t[i]+'0';      c[max+1]='\0';      return c;  }  void fun()  {      int i;      strcpy(a[1],"1");      strcpy(a[2],"2");      for(i=3;i<=210;i++)      {          add(a[i-1],a[i-2],a[i]);      }  }  int main()  {      int n;      fun();      scanf("%d",&n);      while(n--)      {          int num;char s[210];scanf("%s",s);num=strlen(s);        printf("%s\n",a[num]);      }  }  


 

0 0
原创粉丝点击