看到一个关于斐波拉契数列的问题、包括以下问题:
- 计算斐波拉契数列的第50项、100项。
-
斐波拉契数列中的第多少项开始大于100亿。
之前在学习递归的时候也接触过用递归和迭代计算斐波拉契数列的相关知识,看到这个问题的第一反应是int和long的数值范围是否满足要求,于是用简单的循环计算第50项的值、输出为负数即超出了int的表示范围。于是想到用数组保存斐波拉契数的每一位。代码如下:
#include <iostream>
int main()
{
int calline = 100; //斐波拉契的calline项
int f0[30] = { 0 }; f0[29] = 1;
int f1[30] = { 0 }; f1[29] = 1;
int f2[30] = {0};
int *ptrf0 = f0, *ptrf1 = f1, *ptrf2 = f2;
int len = 1; //f2 = f0 + f1: len is the length of f1
int tmplen = 0;
for (int cur = 2; cur < calline; cur++)
{
int carry = 0; //是否有进位
tmplen = 0;
for (int index = 29; index >= 0 && (tmplen < len || carry); index--) {
if (ptrf0[index] + ptrf1[index] + carry > 9)
{
ptrf2[index] = ptrf0[index] + ptrf1[index] + carry - 10;
carry = 1;
}
else
{
ptrf2[index] = ptrf0[index] + ptrf1[index] + carry;
carry = 0;
}
tmplen++;
/* 计算第一个大于999999999的项
if (tmplen >= 10) {
std::cout << "f" << cur << "is the first num that is bigger than 999999999" << endl;
calline = cur;
}*/
}
len = tmplen;
int* ptrtmp = ptrf0;
ptrf0 = ptrf1;
ptrf1 = ptrf2;
ptrf2 = ptrtmp;
}
for(int index = 0; index <= 29; index++)
std::cout << ptrf1[index] << std::endl;
return 0;
}
-
运行结果如下:
curline = 100
curline = 50