Files
Data-Structure/Dev-C++/ExerciseBook/01.17/01.17.cpp
2019-10-20 19:06:37 +08:00

87 lines
1.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <stdio.h>
#include <stdlib.h> // 提供malloc、realloc、free、exit原型
#include "Status.h" //**▲01 绪论**//
/*
* 题1.17———方法1递归算法
*
* 计算k阶斐波那契数列第m项的值
*
* 注计算结果是int类型当项数过大时会溢出
*/
int Algo_1_17_1(int k, int m);
/*
* 题1.17———方法2递推(迭代)算法
*
* 计算k阶斐波那契数列第m项的值
*
* 注计算结果是int类型当项数过大时会溢出
*/
int Algo_1_17_2(int k, int m);
int main(int argc, char* argv[]) {
int k, m;
k = 3;
m = 20;
printf("作为示范,求得 %d 阶斐波那契数列第 %d 项的值为:%d \n", k, m, Algo_1_17_1(k, m));
printf("作为示范,求得 %d 阶斐波那契数列第 %d 项的值为:%d \n", k, m, Algo_1_17_2(k, m));
return 0;
}
// 计算k阶斐波那契数列第m项的值
int Algo_1_17_1(int k, int m) {
int i, value;
if(k < 2 || m < 0) {
exit(OVERFLOW);
}
if(m < k - 1) {
return 0;
} else if(m == k - 1) {
return 1;
} else {
for(i = 1, value = 0; i <= k; i++) {
value += Algo_1_17_1(k, m - i);
}
return value;
}
}
// 计算k阶斐波那契数列第m项的值
int Algo_1_17_2(int k, int m) {
int i, j;
int* fib;
if(k < 1 || m < 0) {
exit(OVERFLOW);
}
// 创建fib数组
fib = (int*) malloc((m + 1) * sizeof(int));
// 初始化前k-1项为0
for(i = 0; i < k - 1 ;i++) {
fib[i] = 0;
}
fib[k-1] = 1;
for(i = k; i <= m; ++i) {
// 累加前k项
for(j = i - 1, fib[i] = 0; j >= i - k; j--) {
fib[i] += fib[j];
}
}
return fib[m];
}