快速幂运算

快速幂基本原理: X^62 = (X^31) ^2

                           X^31 = (X^15) ^2  *  X

                           X^15 = (X^7) ^2  *  X

                           X^7 = (X^3) ^2  *  X

                           X^3 = (X^1) ^2  * X

时间复杂度为  logN

实际中因为最后所求数太大,一般类型都储存不了,所以都会求 其mod一个数的值,具体代码大家自己改动


#include<stdio.h>

int IsEven(int n)
{
if( 0 == (n % 2))  return 1;
else return 0; 
}

long long Pow1(long long X,int n)    // 递归写法 
{                                                        //  写法比较简单 每次递归相乘

if( 0 == n) return 1;

if(1 == n) return X;

if(IsEven(n))                     // 判断是否为偶数
return Pow1( X * X , n / 2);        
else 
return  Pow1(X * X,n / 2) * X;       // 如果不是偶数要多乘以一个X
  


long long Pow2(long long X,int n)     //利用二进制写法 
{                                                         // 将n转换为2进制,例如10  1010    代表8*1  + 4*0 + 2*1 + 1*0
long long res = 1;                    //  因此n^10  =  n^8  * n^2

while(n > 0)
{
if( n & 1)  res = res * X;        //  如果该二进制位为1  就乘上 X^m
X = X * X;                            // 每次循环更新X =  X*X     即  X^2     ,    X^4,     X^8,   X^16,  等等
n >>= 1;         //    n = n >> 1;        每次向右移一位

 
return res;
}


int main(void) // 快速幂运算 
{
long long t;

// t = Pow(2,10);

t = Pow2(2,10);

printf("%lld",t);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值