C語言----斐波那契數的n種實現方法
阿新 • • 發佈:2018-11-09
斐波那契數列(Fibonacci):第1,2兩個數為1,1。從第三個數開始,該數是其前面兩個數之和。
1.使用簡單程式碼實現
(1)每次迴圈只輸出後一位數
思想:前兩個數為1,1。先定義前兩個變數a,b。第三個數為前兩兩個數之和,定義第三個變數c,c=a+b;現在有三個數,為了避免冗餘,把第二個數的值賦給a,第三個數的值賦給b,c=a+b得到第四個數,以此類推…
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { int n = 0; int a = 1; int b = 1; int c = 0; int i = 0; scanf("%d", &n); printf("%5d %5d ", a, b); for (i = 0; i < n - 2;i++) { c = a + b; a = b; b = c; printf("%5d ", c); } printf("\n"); system("pause"); return 0; }
執行結果如圖:
(2)每次迴圈輸出後兩位數,提高效率
思想:只定義前兩個變數a,b。把a+b的結果不放在其他變數中,放在a中(a=a+b),取代原 a中的值,此時a中為第三個數的值,繼續執行,b=b+a,此時b為第四位數,以此類推…
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { int n = 0; int a = 1; int b = 1; int i = 0; scanf("%d", &n); for (i = 0; i < n; i++) { printf("%5d %5d ", a, b); a = a + b; b = b + a; } system("pause"); return 0; }
執行結果如圖:
2.使用陣列方法實現
思想:上述方法只能順序計算並輸出各數,但不能在記憶體中儲存。如果想 直接輸出某個數,是比較困難的,此時可以利用陣列解決。每一個數組元素代表數列中的一個元素,依次求出各數並放在相應的陣列元素中即可。
//用陣列時此處必須給定陣列大小(20) #include <stdio.h> #include <stdlib.h> int main() { int arr[20] = { 1, 1 }; int i = 0; for (i = 2; i < 20; i++) { arr[i] = arr[i - 1] + arr[i - 2]; } for (i = 0; i < 20; i++) { printf("%10d ", arr[i]); } system("pause"); return 0; }
執行結果如圖:
3.使用函式方法實現
思想:思想和簡單程式碼類似,只是使用了函式的呼叫
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
int i = 0;
for (i = 0; i < n - 2; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = fib(n);
printf("%d\n", ret);
system("pause");
return 0;
}
執行結果如圖:
4.使用函式方法實現
//用遞迴方法實現輸出第n個斐波那契數
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = fib(n);
printf("%d\n", ret);
system("pause");
return 0;
}
執行結果如圖: