(斐波那契数列)使用函数输出指定范围内Fibonacc的数(PTA)

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

题目要求:


本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0


函数接口定义:


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


其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。


裁判测试程序样例:


#include 
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:fib(int n);

2:PrintFN(int m,int n)


fib(int n)要求我们输出指定斐波那契数列项的值

首先我们来写一段斐波那契分析一下:

1 1 2 3 5 8 13

可以看到,满足斐波那契数列的特点,即从第三项开始任意一项等于它的前两项的值之和。


我们找出了规律

我们可以想办法将第三项及以后的项用几个有规律的式子表达出来

我们需要设定三个变量 a,b.c

a,b就是c的前两项,然后我们要满足这个

c=a+b;

那么a和b是多少,我们前面提到是从第三项开始,因为前面两项它没有前两项,所以我们初步想的是a =1,b=1,然后c就=2;

然后我们还需要更新数据啊,因为我们要得出后面几项的值,我们需要根据传入的指定项数来更新值,于是我们想法是再定义一个变量i,我们给它赋值为2如果它的值是大于等于n的话,我们直接返回1,反正那我们需要更新c的值。我们这样写一段代码

下面展示一些 内联代码片。


int fib(int n){
  int i =2,a=1,b=1,c=0;
  if(n<=i){
  return 1;
  }else {
  for(i=2;i<n;i++){
  //下面这几个表达式是最关键的
  c=a+b;//求指定项数值的表达式
  a=b;// 观察你会发现为什么这么做,如1 1 2 3 5.....
  //其实就是指定的位置更新值
  b=c;
  }
}
return c;
}


我们实现了这个函数


还有一个

PrintFN(int m,int n),该函数要求的是要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。


1:输出指定区间的所有fibonacci数;

2:相邻数字之间要有一个空格;

3:行末尾不能有多余空格;

4:如果没有满足的fibonacci,则输出一行“No Fibonacci number”。


ok,开始分析,我们要统计的实在m->n区间范围内的斐波那契数,那我们怎么控制条件?我们需要这样做,我们定义一个变量i,我们调用上面的函数fib(int n),我们将i传进去,就能得出相应的斐波那的值,我们不妨直接从开始一直统计吧,让他们进入>=m的范围,但是<=n就好了。我们这样写一段代码:


void PrintFN(int m,int n){
    int i=1;
    int count =0;
    while(fib(i)<=n){
            if(fib(i)>=m){
            count++;
                if(count==1){//分开输出是因为第一个数字前面没有空格
                    printf("%d", fib(i));
                }
                else{
                    printf(" %d ", fib(i));
                }
            }
        i++;
    }
    if(count==0){
        printf("No Fibonacci number\n");
    }
}


我感觉这个函数没啥好解释的,哈哈哈。


1:题目要求的完整函数接口代码



int fib(int n){
  int i =2,a=1,b=1,c=0;
  if(n<=i){
  return 1;
  }else {
  for(i=2;i<n;i++){
  c=a+b;
  a=b;
  b=c;
  }
}
return c;
}
void PrintFN(int m,int n){
    int i=1;
    int count =0;
    while(fib(i)<=n){
            if(fib(i)>=m){
            count++;
                if(count==1){//分开输出是因为第一个数字前面没有空格
                    printf("%d", fib(i));
                }
                else{
                    printf(" %d ", fib(i));
                }
            }
        i++;
    }
    if(count==0){
        printf("No Fibonacci number\n");
    }
}


2:完整代码

下面展示一些 内联代码片。

#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;
}
/* 你的代码将被嵌在这里 */
int fib(int n){
  int i =2,a=1,b=1,c=0;
  if(n<=i){
  return 1;
  }else {
  for(i=2;i<n;i++){
  c=a+b;
  a=b;
  b=c;
  }
}
return c;
}
void PrintFN(int m,int n){
    int i=1;
    int count =0;
    while(fib(i)<=n){
            if(fib(i)>=m){
            count++;
                if(count==1){//分开输出是因为第一个数字前面没有空格
                    printf("%d", fib(i));
                }
                else{
                    printf(" %d", fib(i));
                }
            }
        i++;
    }
    if(count==0){
        printf("No Fibonacci number\n");
    }
}


我的这里是没问题的



注:在PTA做题一定要注意格式的问题,格式出错在PTA是很恶心的,细节决定成败。



相关文章
|
机器学习/深度学习 算法 计算机视觉
基于深度学习的停车位关键点检测系统(代码+原理)
基于深度学习的停车位关键点检测系统(代码+原理)
|
开发工具 Android开发 开发者
习题6-3 使用函数输出指定范围内的完数 (20分)
习题6-3 使用函数输出指定范围内的完数 (20分)
|
9月前
|
机器学习/深度学习 人工智能 算法
《AI赋能鸿蒙Next,开启智能关卡设计新时代》
在游戏开发中,关卡设计至关重要。借助鸿蒙Next系统和AI技术,通过学习玩家行为、自动生成内容、自适应难度调整、优化布局与流程及增强互动性,可实现个性化、多样化的智能关卡设计,提升沉浸感和趣味性,同时提高开发效率与质量。然而,开发者需关注数据安全与算法偏见等问题,确保AI与游戏的深度融合。
188 3
|
JavaScript Java 测试技术
基于SpringBoot+Vue的大学生家教管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的大学生家教管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
395 0
|
监控 Cloud Native Java
传统应用的“云”端新生——Quarkus迁移全攻略
随着云计算的发展,传统单体应用逐渐显现出扩展性和维护成本等问题,而云原生应用因轻量、高效成为新宠。Quarkus作为一款高性能的云原生Java框架,正吸引越来越多开发者。本文详细介绍将传统应用迁移至Quarkus的步骤,包括全面评估、环境搭建、代码重构、数据库迁移、安全性与监控设置,以及测试和部署。通过这些步骤,您可以顺利实现应用的云原生化,享受其带来的诸多优势。
252 3
|
XML 存储 数据格式
RAG效果优化:高质量文档解析详解
本文关于如何将非结构化数据(如PDF和Word文档)转换为结构化数据,以便于RAG(Retrieval-Augmented Generation)系统使用。
944 11
|
SQL 监控 数据库
SQL Server如何判断哪些会话/连接是长连接?
【8月更文挑战第14天】在SQL Server中,判断长连接可通过活动监视器查看持续时间和状态;查询`sys.dm_exec_sessions`获取持续时间超阈值的会话;利用性能监视器跟踪“User Connections”计数器变化;审查应用代码中连接池配置;或分析网络流量寻找持久连接。这些方法有助于管理和优化连接。
221 2
|
C语言
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
PTA 浙大版《C语言程序设计(第3版)》题目集 习题8-4 报数 (20分)
|
Ubuntu 网络安全 Windows
ubuntu16.04版本安装emqx的mqtt服务
ubuntu16.04版本安装emqx的mqtt服务
197 0