分治法求Fibonacci数列

算法课的简单练习

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。

波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。

1、2、3、5、8、13、21……

代码:

#include<iostream>
using namespace std;

struct matrix { long m[2][2]; };
matrix A = { 1,1,1,0 };

//-----------两个矩阵相乘------------------------------
matrix one(matrix a, matrix b)
{
	matrix c;
	int i, j, k;
	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 2; j++)
		{
			c.m[i][j] = 0;
			for (k = 0; k <= 1; k++)
			{
				c.m[i][j] += a.m[i][k] * b.m[k][j];
			}
		}
	}
	return c;
}



//-----------------------矩阵幂乘-------------
//-----------------------分治-----------------
matrix pow(matrix A, int n)
{
	matrix q, w;
	w = { 1,0,0,1 };
	q = w;
	if (n == 0)
		return q;
	else if (n == 1)
		return A;
	else if (n % 2 == 0)
		return one(pow(A, n / 2), pow(A, n / 2));
	else
		return one(one(pow(A, (n - 1) / 2), pow(A, (n - 1) / 2)), A);
}

int main()
{
	int n;
	cout << "你想求第几项?   ";
	cin >> n;
	while (n>0)
	{
		matrix a = pow(A, n - 1);
		cout << "该项是:";
		cout << a.m[0][0];
		cout << endl;
		cout << "你想求第几项?  ";
		cin >> n;

	}
	return 0;
	system("pause");
}

 

 

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值