数论
作者:互联网
矩阵乘法
可以把矩阵理解为二维数组,数存在里面,矩阵乘法的规则:A*B=C
实现代码如下:
const int N=50;
int c[N][N];
void multi(int a[N][N],int b[N][N],int n);
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
for(int k=1;k<=n;k++)
{
if(a[i][k]==0) continue;
for(int j=1;j<=n;j++)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
}
快速幂和矩阵快速幂
- 利用位运算判断奇偶性
if(i&1)
{
奇数....
}
else
{
偶数...
}
- 程序终止问题
exit(0):正常运行程序并退出程序;
exit(1):非正常运行导致退出程序;
return():返回函数,若在主函数中,则会退出函数并返回一值。
快速幂
- 快速幂原理
如果当前的指数是偶数,我们把指数拆成两半,得到两个相同的数,然后把这两个相同的数相乘,可以得到原来的数;
如果当前的指数是奇数,我们把指数拆成两半,得到两个相同的数,此时还剩余一个底数,把这两个相同的数和剩余的底数这三个数相乘,可以得到原来的数。 - 当n>0代码如下
long long res = 1;
// 进行快速幂运算,n 为当前的指数值,n 为 0 的时候运算结束
while (n) {
// 用位运算的方式判断 n 是否为奇数,速度更快,等价于 n%2
if (n & 1) {
// 如果 n 是奇数,那么需要将 x 存入运算结果中
res *= x;
}
// 更新当前的 x 的值
x *= x;
// 用位运算的方式进行 n/2,速度更快,等价于 n/=2
n >>= 1;
}
完整的代码如下:
#include <iostream>
#include <cstdlib>
using namespace std;
// 使用快速幂求出 x^n 的值并返回,不考虑高精度,请控制参数范围
double myPow(double x, int n) {
// 任何不是 0 的数的 0 次幂为 1
if (x && n == 0) {
return 1;
} else if (x == 0 && n == 0) {
exit(1);
}
// 如果 n 是负数,那么返回结果要进行处理
bool judge = false;
if (n < 0) {
judge = true;
n = -n;
}
double res = 1;
while (n) {
// 用位运算的方式判断 n 是否为奇数,速度更快,等价于 n%2
if (n & 1) {
res =res*res%p;
}
x = x*x%p;
// 用位运算的方式进行 n/2,速度更快,等价于 n/=2
n >>= 1;
}
// n 是负数?1.0/res 否则 res
if(judge)
{
return 1.0/res;
}
else
{
return res;
}
}
int main() {
double x;
int n;
while (cin >> x >> n) {
cout << myPow(x, n) << endl << endl;
}
return 0;
}
矩阵快速幂代码如下
const int N=10;
int tmp[N][N];
void multi(int a[][N],int b[][N],int n)
{
memset(tmp,0,sizeof tmp);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
tmp[i][j]+=a[i][k]*b[k][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=tmp[i][j];
}
int res[N][N];
void Pow(int a[][N],int n)
{
memset(res,0,sizeof res);//n是幂,N是矩阵大小
for(int i=0;i<N;i++) res[i][i]=1;
while(n)
{
if(n&1)
multi(res,a,N);//res=res*a;复制直接在multi里面实现了;
multi(a,a,N);//a=a*a
n>>=1;
}
(代码借用了https://blog.csdn.net/wust_zzwh/article/details/52058209)
标签:return,运算,奇数,数论,res,int,用位 来源: https://www.cnblogs.com/LITTLESUNwl/p/10953125.html