大菲波数
Time Limit: 1000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20423
Accepted Submission(s): 6891
Problem Description
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。
Input
输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。
Output
输出为N行,每行为对应的f(Pi)。
Sample Input
5
1
2
3
4
5
Simple Output
1 1 2 3 5
题解:一开始,用的int还真是interesting!!!wa了wa了,emmmm数据少的时候可以用这个吧,
给你们看一下我的错误的思路,受走楼梯那个动态规划想到的。emmmm也算是个模板。
没有AC的代码:
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int fib(int num)
{
if(num==1||num==2)
return 1;
int a=1;
int b=1;
int temp=0;
for(int i=3;i<=num;i++)
{
temp=a+b;
a=b;
b=temp;
}
return temp;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int pi;
scanf("%d",&pi);
printf("%d
",fib(pi));
}
return 0;
}
后来,emmmm因为是大数,所以肯定要开个数组,emmmm还得节约时间,
不能输一个数就从头算一个数,二维数组吧,加内存,减时间。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int fib[1003][1003];
int main()
{
memset(fib,0,sizeof(fib));
fib[1][1]=1;
fib[2][1]=1;
for(int i=3;i<=1000;i++)
{
for(int j=1;j<=1000;j++)//这里加法运算真是剪不断,理还乱,这里最重要了,错了就全完蛋。
{
fib[i][j+1]=(fib[i][j]+fib[i-1][j]+fib[i-2][j])/10;
fib[i][j]=(fib[i][j]+fib[i-1][j]+fib[i-2][j])%10;
}
}
int t;
scanf("%d",&t);
while(t--)
{
int pi;
scanf("%d",&pi);
int node=0;
int i=1000;
while(!fib[pi][i])
{
node=i;
i--;
}
for(int i=node-1;i>=1;i--)
printf("%d",fib[pi][i]);
printf("
");
}
return 0;
}
今天也是元气满满的一天!good luck!