HDU 1715 大菲波数
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1715
MS我写的比较麻烦,各种进位什么的,学长说用递归加打表就可以搞定。
我的
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #define max 1000 4 char n1[max],n2[max],n3[max]; 5 void add(char *n1,char *n2,char *n3) 6 { 7 memset(n3,0,max); 8 int len=strlen(n1); 9 int i; 10 for(i=0;i<len;i++) 11 { 12 n3[i]=n1[i]-'0'+n2[i]-'0'+n3[i]; 13 if(n3[i]>=10) 14 { 15 n3[i]=n3[i]-10+'0'; 16 n3[i+1]=1; 17 } 18 else n3[i]+='0'; 19 } 20 if(n2[i]!=0)n3[i]=n2[i]+n3[i]; 21 else if(n3[i]!=0) n3[i]+='0'; 22 23 } 24 void prn(char *p) 25 { 26 int i=strlen(p)-1; 27 for(;i>=0;i--) 28 { 29 printf("%c",p[i]); 30 } 31 printf("\n"); 32 } 33 int main() 34 { 35 int i,n,t; 36 scanf("%d",&n); 37 while(n--) 38 { 39 scanf("%d",&t); 40 if(t==1||t==2) 41 { 42 printf("1\n"); 43 continue; 44 } 45 memset(n1,0,max); 46 n1[0]='1'; 47 memset(n2,0,max); 48 n2[0]='1'; 49 for(i=3;i<=t;i++) 50 { 51 add(n1,n2,n3); 52 strcpy(n1,n2); 53 strcpy(n2,n3); 54 } 55 prn(n3); 56 } 57 return 0; 58 }
学长的
View Code
1 const int N = 1007; 2 int f[N][217]; 3 int main() { 4 int i, j; 5 f[1][0] = f[2][0] = 1; 6 for(i = 3; i < N; i++) { 7 for(j = 0; j <= 210; j++) 8 f[i][j] = f[i-1][j]+f[i-2][j]; 9 int flag = 0; 10 for(j = 0; j <= 210; j++) { 11 int tmp = f[i][j] + flag; 12 flag = tmp/10; 13 f[i][j] = tmp%10; 14 } 15 } 16 //freopen("data.in", "r", stdin); 17 int n, pi; 18 cin >> n; 19 while(n--) { 20 cin >> pi; 21 i = 210; 22 while(f[pi][i] == 0) 23 i--; 24 for(;i >= 0; i--) 25 printf("%d", f[pi][i]); 26 printf("\n"); 27 } 28 return 0; 29 }