求斐波那契数列第100个数
因F(100)位数较多,创建大整数类fnum来实现大整数的加减、赋值和输出
思想:用整型数组倒序存储大整数的每一位数,然后每一位对应加减时考虑进位
//fnum.h
#include <iostream>
using namespace std;
class fnum
{
public:
fnum(int a);
fnum();
~fnum();
int* value;
int len;
fnum operator +(fnum a);
fnum operator =(fnum a);
friend ostream& operator<<(ostream&, fnum a);
};
//fnum.cpp
#include "fnum.h"
#include <algorithm>
#include <iostream>
using namespace std;
fnum::fnum() {
len = 0;
value = new int[50];
memset(value, 0, 50 * sizeof(int));
}
fnum::fnum(int a) {
len = 0;
value = new int[50];
memset(value, 0, 50 * sizeof(int));
int n = a;
while (n != 0) {
value[len] = n % 10;
n /= 10;
len++;
}
}
fnum::~fnum() {
}
fnum fnum::operator+(fnum a) {
fnum temp;
int mlen = max(this->len, a.len), wei = 0, sum;
if (mlen >= 50) {
temp.value = new int[mlen + 1];
memset(temp.value, 0, (mlen + 1) * sizeof(int));
}
for (int i = 0;i < mlen;i++) {
sum = this->value[i] + a.value[i];
temp.value[i] = (sum + wei) % 10;
wei = (sum + wei) / 10;
temp.len++;
}
if (wei != 0) {
temp.value[mlen] = wei;
temp.len++;
}
return temp;
}
fnum fnum::operator=(fnum a) {
this->len = a.len;
if (a.len > 50) {
this->value = new int[a.len];
}
for (int i = 0;i < a.len;i++) {
this->value[i] = a.value[i];
}
return *this;
}
ostream& operator<<(ostream& output, fnum a) {
int i = a.len - 1;
while (a.value[i] == 0) {
i--;
}
while (i >= 0) {
output << a.value[i];
i--;
}
return output;
}
//main.cpp
#include "iostream"
#include "fnum.h"
#include "ctime"
using namespace std;
fnum ff(int n) {
if (n == 1 || n == 2) {
fnum fn1(1);
return fn1;
}
else
{
fnum re,f1=ff(n - 1),f2=ff(n - 2);
re = f1 + f2;
return re;
}
}
fnum ffy(int n, fnum a, fnum b) {
if (n == 1) {
return a;
}
return ffy(n - 1, b, a + b);
}
int main() {
fnum pre(1), ppre(1), cur,result;
int num;
cout << "请输入数字:" << endl;
cin >> num;
if (num <= 0) {
cout << "输入错误" << endl;
return 0;
} /*result = ff(num);
cout << "递归结果:"<<result;*/
result = ffy(num,pre,ppre);
cout << "尾递归结果:" << result<<endl;
return 0;
}
虽然用大整数解决了位数问题,但是普通递归算F(100)肯定爆栈了,用尾递归进行优化成功得到答案
思考:实验过程中给value数组赋初值时出现错误,一开始写的是memset(value,0,sizeof(value)); 因为value是数组名称即指针类型,
sizeof(value)的值为指针类型长度,所以数组中后续数字为随机数字而不为0。
然后也对尾递归进行了研究,觉得尾递归虽然也是调用自身,但是更像是循环的简化版本。