(十五)王道机试指南___二分求幂

本文介绍了一种高效的求幂算法——二分求幂法。该方法通过将指数转换为二进制并利用位运算实现快速幂运算,适用于计算形如A^B的问题,尤其在求解大指数时能有效避免整数溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算例一【人见人爱A ^ B (九度教程第57 题)】

  • 题目描述

  • 解题思路

①二分求幂的思想:12^6=      12*12*12*12 *1       *        12*12*1          ____________

                          6的二进制:             1                                  1                         0

  • 解题代码

#include <stdio.h>
int main ()
{
    int a, b;
    while (scanf ("%d%d",& a,& b) != EOF )
    {
        if (a == 0 && b == 0)
            break;
        int ans = 1; //保存最终结果变量,初始值为1
        while(b != 0)   //若b不为0,即对b转换二进制过程未结束
        {
            if (b % 2 == 1)   //若当前二进制位为1,则需要累乘a的2^k 次至变量ans,其中2^k次为当前二进制位的权重
            {
                ans *= a; //最终结果累乘a
                ans %= 1000; //求其后三位数
            }
            b /= 2; //b除以2
            a *= a; //求下一位二进制位的权重, a求其平方,即从a的1次开始,依次求的a的2次, a的4次...
            a %= 1000; //求a的后三位
        } //一边计算b的二进制值,一边计算a的2^k次,并将需要的部分累乘到变量ans上
        printf ("%d\n",ans);  //输出
    }
    return 0;
}
  • 注意点

①这里有很重要的一点就是:10000^10000一定会溢出,想都不用想,马上找简化的方法,这里因为只输出最后三位而且过程中都只出现的乘法,所以只要每次运算的时候都保留三位,就可以用int型解决这些数字的存储问题且不影响精度。所以说啊,发现溢出一定要检查是否有简化的方法!!

②这题的思路还不错的,记下二分求幂的方法!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值