问题描述:
“斐波那契数列(Fibonacci)”的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci),斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、…… 这个数列从第三项开始,每一项都等于前两项之和。你的任务是求斐波那契数列的前n项。
输入与输出要求:
输入一个正整数n(3<=n<=45),代表斐波那契数列的项数。输出斐波那契数列前n项,每五个数为一行,每个数字占12个字符且靠右对齐,最后一个数后为换行符。
此时用递归解决看似简单
#include<stdio.h>
long long Fibonacci(int n);
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(i%5==0){
printf("%12lld\n",Fibonacci(i));
}else{
printf("%12lld\t",Fibonacci(i));
}
}
return 0;
}
long long Fibonacci(int n)
{
if(n==1||n==2)
{
return 1;
}else
{
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
实则会超时
但若用这样的
#include<stdio.h>
long long Fibonacci(int n);
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(i%5==0){
printf("%12lld\n",Fibonacci(i));
}else{
printf("%12lld",Fibonacci(i));
}
}
return 0;
}
long long Fibonacci(int n)
{
long long ai_2=1,ai_1=1,ai;
for(int i=3;i<=n;i++)
{
ai=ai_1+ai_2;
ai_2=ai_1;
ai_1=ai;
}
if(n==2)
return ai-1;
else
return ai;
}
或者这样的
#include<stdio.h>
int main()
{
int n,count=0,i;
long long x1,x2,x3;
scanf("%d",&n);
x1=1,x2=1;
printf("%12lld",x1);
printf("%12lld",x2);
count=2;
for(i=1;i<n-1;i++)
{
x3=x1+x2;
printf("%12lld",x3);
x1=x2,x2=x3;
count++;
if(count>=5)
{
printf("\n");
count=0;
}
}
printf("\n");
return 0;
}