快速幂运算

快速幂基本原理: 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;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 17:33
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务