原题:
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
5Sample Output
1
1
2
3
5
这道题就是HDUOJ 1316 - How Many Fibs?的简易版,通过预处理,再直接数组定位到答案就好了,需要注意的是F1 = F2 = 1
解题思路:
1. 使用string比直接char[]节省内存占用,有c++库函数,用起来方便
2. 预处理:通过string数组先将前1000个斐波那契数字算好,存起来
3. 注意答案的输出格式
代码:
#include<stdio.h>
#include <string>
#include <iostream>
using namespace std;
const int MAXFIB = 1001;//斐波那契个数
string sum[MAXFIB];
void Add(int num)
{
int i;
int LengthOfTow = sum[num - 1].length() - sum[num - 2].length();//两个数相差的长度
int temp;
short CarryBit = 0;//进位
for (i = sum[num - 2].length() - 1; i >= 0; i--)//从两个数中小的数[F(n-2)]开始,再从**string**数组元素倒退,逐个加法进位
{
temp = (sum[num - 2][i] - '0') + (sum[num - 1][i + LengthOfTow] - '0') + CarryBit;
CarryBit = temp / 10;
sum[num] = char((temp % 10) + '0') + sum[num];
}
for (i = i + LengthOfTow; i >= 0; i--)//从两个数中大的数[F(n-1)]开始进位
{
temp = (sum[num - 1][i] - '0') + CarryBit;
CarryBit = temp / 10;
sum[num] = char((temp % 10) + '0') + sum[num];
}
if (CarryBit != 0)//两数相加,总数位数最多是大数位数+1
{
sum[num] = char(CarryBit + '0') + sum[num];
}
}
void PreFibonacci()//预处理
{
sum[0] = "1";
sum[1] = "1";
int i;
for (i = 2; i < MAXFIB; i++)
{
Add(i);
//cout <<i << " "<< sum[i] << endl;
}
}
int main()
{
int N;
int Pi;
PreFibonacci();
scanf("%d", &N);
while (N--)
{
scanf("%d", &Pi);
cout << sum[--Pi] << endl;
}
}