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

作者 C课程组

单位 浙江大学

本题要求实现一个计算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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

参考答案

int fib( int n )
{
    int a[10000] = {1,1}, i;//定义一个数组事先存储数列前两位,保证非特殊要求函数单一出口
    for(i=0;i<n;i++)
        a[i+2] = a[i] + a[i+1];//for循环搭配数组,相较递归函数效率更高
    return a[i-1];//返回对应数列值
}
void PrintFN( int m, int n )
{
    int i, flag = 0;
    for(i=1;fib(i)<=n;i++)
    {
        if(fib(i)>=m)//调用数列函数判断给定范围内是否存在Fibonacci数
            flag ++;//指示器自增用以输出第一个Fibonacci数
        if(flag==1)
            printf("%d", fib(i));//输出第一个Fibonacci数
        if(flag>1)
            printf(" %d", fib(i));//输出剩下的Fibonacci数并保证最后一个数后无空格
    }
    if(!flag)
        printf("No Fibonacci number");//若给定范围无Fibonacci数输出语句
}

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值