算法课的简单练习
分治算法的基本思想是将一个规模为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");
}