pta输出指定范围内的斐波那契数列
这是一道pta的题目,对新人有一定难度(我就是)。
题目
本题要求实现一个计算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;
}
/* 你的代码将被嵌在这里 */
作业代码(后面有很多可以改进的地方)
int fib(int n){
int i=0,a[10000];//n==2;
for(;i<=n;i++){
if(i==0||i==1){
a[0]=a[1]=1;
}else a[i]=a[i-2]+a[i-1];
if(i==n-1){
return a[i];
}
void PrintFN( int m, int n ){
int i;
int cnt=0;
for(i=0;i<=10000;i++){
if(fib(i)>10000){
break;
} if (fib(i)==m){
if(cnt==1){
printf(" ") ;
}
else printf("%d",fib(i));
cnt++;
}else if(fib(i)>m&&fib(i)<=n){
cnt++;
if(cnt==1)printf("%d",fib(i));
else printf(" %d",fib(i));
}
}
if(cnt==0){
printf("No Fibonacci number");
}
}
分步改正并讲解
int fib(int n);//返回第n项斐波那契数。
int fib(int n){//返回第n项斐波那契数。
int i=0,a[10000];//n==2;
for(;i<=n;i++){
if(i==0||i==1){
a[0]=a[1]=1;
}else a[i]=a[i-2]+a[i-1];
if(i==n-1){
return a[i];
}//牺牲空间而下面的牺牲时间(每次都从头算一遍)
}
}/*int fib( int n ){
if(n==1||n==2)
return 1;
return fib(n-2)+fib(n-1);
}*///可用其替换啊啊啊啊!
void PrintFN( int m, int n )//返回【m,n】之间的斐波那契数列
void PrintFN( int m, int n ){//输出所有斐波那契数列并一直到第m项,打印出来
int i;
int cnt=0;
for(i=0;i<=10000;i++){
if(fib(i)>10000){//因为会有内存溢出
break;
} if (fib(i)==m){
//下面我写的代码很奇怪吧,因为如果不这么做,当m==1时就会 输出三个1;所以很无奈
/*int first = 1;
if(m==1){
printf("1 1");
first = 0;
m = 2;
}*///这样是一种更好的做法,直接输出1 1;
if(cnt==1){
printf(" ") ;
}
else printf("%d",fib(i));
cnt++;
}else if(fib(i)>m&&fib(i)<=n){
cnt++;
if(cnt==1)printf("%d",fib(i));
else printf(" %d",fib(i));
}
}
if(cnt==0){
printf("No Fibonacci number");
}
}
感谢众多大神的帮助,这篇文章只是为了帮助更多的入门者更好的走下去。
文中有参考https://blog.csdn.net/qq_43328781/article/details/85157414