【演算法】最大的Fibonacci數
阿新 • • 發佈:2018-11-26
最大的Fibonacci數
無窮數列1,1,2,3,5,8,13,21,34,55…稱為Fibonacci數列,它可以遞迴地定義為
F(n)=1 ………..(n=1或n=2)
F(n)=F(n-1)+F(n-2)…..(n>2)
現要你來求第n個斐波納奇數。(第1個、第二個都為1)
輸入
第一行是一個整數m(m<5)表示共有m組測試資料
每次測試資料只有一行,且只有一個整形數n(n<20)
輸出
對每組輸入n,輸出第n個Fibonacci數
樣例輸入
3
1
3
5
樣例輸出
1
2
5
解題思路:
先排序,比較相鄰兩元素之間差大小,留下最大值
寫了氣泡排序,和桶排序兩種
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #define bucket_size 10//給10個桶 void bubblesort(float m[],int n){ int i,j; float k; for(i=0;i<n-1;i++){ for(j=0;j<n-1-i;j++){ if(m[j]>m[j+1]) { k=m[j]; m[j]=m[j+1]; m[j+1]=k; } } } } typedef struct node { float data; struct node *next; }KeyNode; void bucketsort(float m[],int n) { int i,j; KeyNode **bucket_table = (KeyNode **)malloc(bucket_size * sizeof(KeyNode*)); //建立桶 for(i = 0;i <bucket_size;i++) { bucket_table[i] = (KeyNode*)malloc(sizeof(KeyNode)); bucket_table[i]->data = 0; bucket_table[i]->next = NULL; } //插入元素 for(j = 0;j < n;j++) { KeyNode *node = (KeyNode *)malloc(sizeof(KeyNode)); node->data = m[j]; node->next = NULL; int index = m[j]/10; //大小為2 KeyNode *p = bucket_table[index]; if(p->data == 0 && p->next==NULL) { bucket_table[index]->next = node; (bucket_table[index]->data)++; } else { while(p->next != NULL && p->next->data <= node->data){ p = p->next; (bucket_table[index]->data)++; } node->next = p->next; p->next = node; } } int num=0; KeyNode *k=bucket_table[num]; for(i=0;i<n;i++){ if(k->next==NULL){ num++; i--; k=bucket_table[num]; } else{ m[i]=k->next->data; k=k->next; } } } int main(){ int n,i; float m[100],max,k; clock_t start,finish; double time; scanf("%d",&n); for(i=0;i<n;i++) scanf("%f",&m[i]); printf("氣泡排序:\n"); start=clock(); bubblesort(m,n); k=0.0;max=0.0; for(i=0;i<n-1;i++){ k=m[i+1]-m[i]; if(max<k) max=k; } printf("%.1f\n",max); finish=clock(); time=(double)(finish-start)/CLOCKS_PER_SEC; printf("執行時間為:%f\n",time); printf("桶排序:\n"); start=clock(); bucketsort(m,n); k=0.0;max=0.0; for(i=0;i<n-1;i++){ k=m[i+1]-m[i]; if(max<k) max=k; } printf("%.1f\n",max); finish=clock(); time=(double)(finish-start)/CLOCKS_PER_SEC; printf("執行時間為:%f\n",time); return 0; }