习题6-4 使用函数输出指定范围内的Fibonacci数

浙大版《C语言程序设计(第4版)》题目集参考答案


本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。

函数接口定义: 

int fib( int n ); void PrintFN( int m, int n );

其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[mn]内的所有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

提交结果:

基本思路:

1.由于n的值不大可以使用递归或者用Fibonacci数的特点求第n项的Fibonacci数

2.遍历所有Fibonacci数,利用变量判断有无,有则按照要求打印

代码实现:

1.递归

int fib(int n)
{
    if (n == 1 || n == 2)//前两项Fibonacci数为1
    {
        return 1;
    }
    else//第3项起的Fibonacci数
    {
        return fib(n - 1) + fib(n - 2);
    }
}
void PrintFN(int m, int n) {
    int flag = 0;//有无Fibonacci数
    for (int i = 1; fib(i) <= n; i++) {
        if (fib(i) >= m)//在区间内
        {
            flag++;
            if (flag == 1)//行末不得有多余空格
            {
                printf("%d", fib(i));
            }
            else
            {
                printf(" %d", fib(i));
            }
        }
    }
    if (flag == 0)//给定区间内没有Fibonacci数
    {
        printf("No Fibonacci number");
    }
}

2.特点

int fib(int n)
{
    int fib = 0;
    if (n == 1 || n == 2)//前两项Fibonacci数为1
    {
        return 1;
    }
    else
    {
        int a = 1;
        int b = 1;
        for (int i = 3; i <= n; i++)//第3项起的Fibonacci数
        {
            fib = a + b;
            a = b;
            b = fib;
        }
        return fib;
    }
}
void PrintFN(int m, int n) {
    int flag = 0;//有无Fibonacci数
    for (int i = 1; fib(i) <= n; i++) {
        if (fib(i) >= m)//在区间内
        {
            flag++;
            if (flag == 1)//行末不得有多余空格
            {
                printf("%d", fib(i));
            }
            else
            {
                printf(" %d", fib(i));
            }
        }
    }
    if (flag == 0)//给定区间内没有Fibonacci数
    {
        printf("No Fibonacci number");
    }
}

欢迎提问和纠错,共同讨论一起进步!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用一个函数输出指定范围Fibonacci的个。具体实现方法如下: 1. 定义一个函数函数名为fibonacci_count,接受两个参,分别为范围的起始值和结束值。 2. 在函数内部,定义一个变量count,用于记录符合条件的Fibonacci的个,初始值为。 3. 使用一个while循环,计算Fibonacci列中每个的值,直到计算出的值大于等于结束值。 4. 在循环中,判断当前计算出的值是否在指定范围内,如果是,则将count加1。 5. 循环结束后,返回count的值,即为指定范围内的Fibonacci的个。 下面是具体的代码实现: ```python def fibonacci_count(start, end): count = a, b = , 1 while b < end: if b >= start: count += 1 a, b = b, a + b return count ``` 使用函数,可以输出指定范围Fibonacci的个。例如,要输出范围在10到100之间的Fibonacci的个,可以调用函数如下: ```python count = fibonacci_count(10, 100) print(count) ``` 输出结果为5,即在10到100之间有5个Fibonacci。 ### 回答2: 斐波那契列是指,前两个为1,从第三个开始,每个都是其前面两个之和。其列为:1, 1, 2, 3, 5, 8, 13, 21, 34…等等。在学上可以用递归或迭代的方式计算斐波那契列中第 n 个的值。在本题目中,要使用函数输出指定范围内斐波那契的个。 首先,需要明确该函数的输入参,要指定范围,故需要在函数定义时定义两个参,例如为:def fibonacci_count(start_num, end_num)。 然后,需要编写函数内部程序来计算斐波那契列中指定范围内斐波那契的个。可以通过设置一个计变量,在迭代计算出每个斐波那契时,判断是否在范围内,如果在范围内,则计器加一。 通过以上操作,可以得到以下代码实现: ``` def fibonacci_count(start_num, end_num): n1, n2 = 1, 1 count = 0 if start_num == 1: count += 1 while n2 <= end_num: n1, n2 = n2, n1 + n2 if n2 >= start_num and n2 <= end_num: count += 1 return count ``` 在该代码中,首先通过 n1 和 n2 定义斐波那契列中前两个的值,并初始化计器变量 count 为 0。然后,在循环中,每次计算斐波那契列中的第 n 个,判断该是否在指定范围内,如果是,则计器变量加一。 最后,将计器 count 的值返回即可。 以上为使用函数输出指定范围内斐波那契的个的方法和代码实现。 ### 回答3: 斐波那契列是一组字序列,其前两个字为0和1,随后的每个字都是前两个字之和。因此,斐波那契列的前几个字如下所示:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ....等。 准确地说,斐波那契列中的第n项为:F(n) = F(n-1) + F(n-2)。其中,F(0)=0,F(1)=1。 要输出指定范围内的斐波那契字个,可以使用函数进行处理。我们可以定义一个函数,输入两个整n和m,其中n表示下限,m表示上限。函数输出指定范围内斐波那契字的个。 按照题目要,我们需要指定范围内的斐波那契字个。可以采用两种方式进行实现:递推算法和递归算法。 一、递推算法 斐波那契列最基本的算法就是递推算法,即从头开始计算每个斐波那契字。根据斐波那契序列的定义,从第3项起,每个字都是前两个字之和。因此,我们可以使用一个循环语句,依次计算每个斐波那契字并记录其个。 具体实现如下所示: ``` def fib_count_range(n, m): n1 = 0 n2 = 1 count = 0 while n2 <= m: if n2 >= n: count += 1 n1, n2 = n2, n1 + n2 return count ``` 其中,变量n1和n2初始化分别为0和1,表示斐波那契序列中的前两个字。count初始化为0,表示斐波那契字的个。 运用while循环计算斐波那契列中的字,用if语句判断该值是否在指定范围内。如果在范围内,则将count加1。最后返回count值即可。 二、递归算法 斐波那契列也可以使用递归算法来计算,它是一种通过调用自身的函数来实现重复的结构(例如斐波那契列)的方法。但是,递归算法的效率较低,因为它重复计算一些字。 具体实现如下所示: ``` def fib(n): if n <= 0: return 0 elif n == 1: return 1 else: return fib(n-1) + fib(n-2) def fib_count_range(n, m): count = 0 i = 0 while fib(i) <= m: if fib(i) >= n: count += 1 i += 1 return count ``` 其中,fib函数用于计算第n个斐波那契字。变量count、i用于计,while循环用于计算斐波那契列中的字。用if语句判断该值是否在指定范围内。如果在范围内,则将count加1。最后返回count值即可。 最后,根据实际使用情况和需,选择递推算法或递归算法计算指定范围内的斐波那契字个即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值