c语言输出斐波那契数列pta,(斐波那契数列)使用函数输出指定范围内Fibonacc的数(PTA)...

函数接口定义:

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

我们实现了这个函数

还有一个

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=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 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=m){

count++;

if(count==1){//分开输出是因为第一个数字前面没有空格

printf("%d", fib(i));

}

else{

printf(" %d", fib(i));

}

}

i++;

}

if(count==0){

printf("No Fibonacci number\n");

}

}

我的这里是没问题的

b774ba64b08e4428a38a36535be61b0f.jpg

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

e5576e231d7d46e69503feb805b9b872.gif

PTA做题链接

04db75940c7b4398afd09ee2d58e3429.jpg

兄弟们一起刷题呀!

---------- jgdabc

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值