我正在尝试编写自己的矩阵类(可能已经存在一百万个)。这对我有多种用法很有用,其中一种方法是对斐波那契数进行计数,并且需要快速(对数)求幂,总的来说,它的工作原理如下:
power(a, b) = power(a, b/2) * power(a, b/2) * power(a, b%2)
现在,我正在尝试重载operator ^来执行幂运算,而不是按位XOR。我知道我不应该,这很杂乱,但那都是为了个人娱乐。
这是所有代码:
#include <iostream>
using namespace std;
class matrix
{
public:
int h;
int w;
int **m = nullptr;
matrix(int height, int width)
{
h = height;
w = width;
m = new int*[h];
for (int i = 0; i < h; i++)
{
m[i] = new int[w];
for (int j = 0; j < w; j++)
m[i][j] = 0;
}
}
~matrix()
{
for (int i = 0; i < h; i++)
delete m[i];
delete m;
}
matrix operator*(matrix b)
{
if (w != b.h)
return matrix(1, 1);
matrix res(h, b.w);
for (int i = 0; i < h; i++)
for (int j = 0; j < b.w; j++)
for (int k = 0; k < w; k++)
res.m[i][j]+=m[i][k]*b.m[k][j];
return res;
}
matrix operator^(int b)
{
if (w != h)
return matrix(1, 1);
if (b == 1)
return *this;
matrix p(w, w);
if (b == 0)
{
for (int i = 0; i < w; i++)
p.m[i][i]=1;
return p;
}
p = (*this)^(b/2);
return p*p*((*this)^(b%2));
}
void print()
{
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
cout << m[i][j] << " ";
cout << "\n";
}
}
};
int main()
{
matrix fib(2, 2);
fib.m[0][0] = 0; fib.m[0][1] = 1; fib.m[1][0] = 1; fib.m[1][1] = 1;
int n;
cin >> n;
(fib^n).print();
}
程序有时运行良好,有时返回奇怪的值,有时崩溃。
除了需要帮助,我感觉自己犯了一个基本错误。我不知道还能说些什么。
谢谢。