您的位置:首页 > 其它

BigNums——HDUOJ 1715 - 大菲波数(预处理)

2017-10-21 18:10 176 查看

原题

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

Sample 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息