C語言——使用函式輸出指定範圍內的Fibonacci數
C語言——使用函式輸出指定範圍內的Fibonacci數
本題要求實現一個計算Fibonacci數的簡單函式,並利用其實現另一個函式,輸出兩正整數m和n(0<m≤n≤10000)之間的所有Fibonacci數。所謂Fibonacci數列就是滿足任一項數字是前兩項的和(最開始兩項均定義為1)的數列。
函式介面定義:
int fib( int n );
void PrintFN( int m, int n );
其中函式fib須返回第n項Fibonacci數;函式PrintFN要在一行中輸出給定範圍[m, n]內的所有Fibonacci數,相鄰數字間有一個空格,行末不得有多餘空格。如果給定區間內沒有Fibonacci數,則輸出一行“No Fibonacci number”。
裁判測試程式樣例:
#include <stdio.h>
int fib( int n );
void PrintFN( int m, int n );
int main()
{
int m, n, t;
scanf("%d %d %d", &m, &n, &t);
printf("fib(%d) = %d\n", t, fib(t));
PrintFN(m, n);
return 0;
}
/* 你的程式碼將被嵌在這裡 */
輸入樣例1:
20 100 7
輸出樣例1:
fib(7) = 13
21 34 55 89
輸入樣例2:
2000 2500 8
輸出樣例2:
fib(8) = 21
No Fibonacci number
程式碼實現如下:
方法一:
未優化
int fib(int n) {
if(n == 0) return 0;
else if(n == 1) return 1;
int prev = 0, curr = 1; // q代表前數,p代表後數
for (int i = 2; i <= n; i++) {
int next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}
void PrintFN(int m, int n) {
int i = 0; // 第幾位斐波那契數列
int number[30]; // 存放'斐波那契數列'在區間[m,n]的數
int index = 0; // 記錄number的指標/新下標/長度
int num = fib(i);
while(num <= n) {
if(num >= m && num <= n) number[index++] = num;
num = fib(++i);
}
if (index == 0) printf("No Fibonacci number");
else
for (int idx = 0; idx < index; idx++) {
if (idx == index-1) printf("%d", number[idx]);
else printf("%d ", number[idx]);
}
}
優化後
int fib(int n) {
if(n == 0) return 0;
else if(n == 1) return 1;
int prev = 0, curr = 1; // q代表前數,p代表後數
for (int i = 2; i <= n; i++) {
int next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}
void PrintFN(int m, int n) {
int i = 0; // 第幾位斐波那契數列
int flag = 0; // 記錄是否第一次列印了 1:未 0: 不是第一次了
int num = fib(i);
while(num <= n) {
if(num >= m && num <= n) {
if(flag) printf(" %d", num);
else {
printf("%d", num);
flag = 1;
}
}
num = fib(++i);
}
if(!flag) printf("No Fibonacci number");
}
方法二
最優方案
int fib(int n) {
if(n == 1 || n == 2)
return 1;
else
return fib(n-1)+fib(n-2);
}
void PrintFN(int m, int n) {
int i = 1;
int flag = 1;
int count = 0;
while(fib(i) < m) {
i++;
}
while(fib(i) <= n) {
if(flag) {
printf("%d", fib(i));
flag = 0;
} else {
printf(" %d", fib(i));
}
count++;
i++;
}
if(count == 0) {
printf("No Fibonacci number\n");
}
}
相關文章
- 6-1 使用函式輸出指定範圍內Fibonacci數的個數函式
- 6-3 使用函式輸出指定範圍內的完數 (20分)函式
- C語言程式生成指定範圍的不重複的隨機數C語言隨機
- C語言_輸入輸出函式_PAGE5C語言函式
- 在指定範圍內生成隨機數隨機
- C語言qsort函式的使用C語言函式
- C語言輸出多位小數C語言
- C語言的函式C語言函式
- 匹配指定範圍整數正規表示式
- C語言輸入輸出C語言
- c語言快速排序(庫函式使用)C語言排序函式
- C語言輸入一個數輸出對應的值C語言
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- C語言 execve()函式C語言函式
- C語言常用函式C語言函式
- c語言輸出100!的數值中的0的個數C語言
- 使用 Carbon 獲取指定時間範圍內的日期陣列陣列
- C語言函式sscanf()的用法C語言函式
- 淺談各種語言輸出函式小數點 00 返回問題函式
- C語言 函式指標C語言函式指標
- C語言基礎函式C語言函式
- 08. C語言函式C語言函式
- C語言函式呼叫棧C語言函式
- 如何產生指定範圍的隨機數隨機
- C 語言輸出100至200之間的質數(素數)
- C++逐字輸出函式C++函式
- C語言函式指標與回撥函式使用方法C語言函式指標
- thinkphp 輸出變數使用函式處理PHP變數函式
- div拖動範圍限定在指定元素內
- C語言基礎-2、函式的定義與使用C語言函式
- C語言——常用標準輸入輸出函式 scanf(), printf(), gets(), puts(), getchar(), putchar(); 字串拷貝函式 strcpy(), strncpy(), strchr(), strstr()函式用法特點C語言函式字串
- GO語言————6.5 內建函式Go函式
- C語言解讀assert函式C語言函式
- C語言庫函式及示例C語言函式
- C#語言函式遞迴C#函式遞迴
- CSS 設定指定範圍li元素樣式CSS
- c語言函式指標的定義C語言函式指標
- C語言:使用函式計算兩點間的距離C語言函式