数学问题-二分求幂例题

例 4.10 人见人爱 A ^ B 

题目描述

求 A^B 的最后三位数表示的整数。说明:A^B 的含义是“A 的 B 次方”

输入

输入数据包含多个测试实例,每个实例占一行,由两个正整数 A 和 B 组成 ( ),如果 A=0, B=0,则表示输入数据的结束,不做处理。

输出

对于每个测试实例,请输出 A^B 的最后三位表示的整数,每个输出占一行。

样例输入

2 3
12 6
6789 10000
0 0

样例输出

8
984
1 

解题代码

#include<cstdio>

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
            {
                ans *= a;
                ans %= 1000;//求后三位数
            }
            b /= 2;//b除以2
            a *= a;//求下一位二进制位的权重,即从a的1次开始,依次求a的2次、4次......
            a %= 1000;//求a的后三位
        }//一边计算b的二进制值,一边计算a的2^k次,并将需要的部分累乘到ans上
        printf("%d\n", ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/yun-an/p/11074833.html

时间: 2024-07-28 16:07:17

数学问题-二分求幂例题的相关文章

二分求幂,快速求解a的b次幂

一个引子 如何求得a的b次幂呢,那还不简单,一个for循环就可以实现! void main(void) { int a, b; int ans = 1; cin >> a >> b; for (int i = 1; i <= b; i++) { ans *= a; } cout << ans; } 那么如何快速的求得a的b次幂呢?上面的代码还可以优化吗? 当然是ok的!下面就介绍一种方法-二分求幂. 二分求幂 所谓二分求幂,即是将b次幂用二进制表示,当二进制位k位

二分求幂(快速求幂,二进制求幂)

二分求幂, 非递归求法(二进制求法): 比如 2^5就是5个2相乘,按照5的二进制求 3^10就是8个3相乘,再2个3相乘. 处理幂的二进制,具体实现代码如下: long long quickmulti(long long a,long long b) { long long res=1; while(b) { if(b&1) //如果最后一位为1,则res*=a; res*=a; a*=a; //a*=a b>>=1; //b%=2 } return res; }

二分求幂

2017-07-20 17:47:25 writer:pprp 介绍:二分求幂原理: 一般用递归求解: 代码如下: int power(ll base,unsigned int exponent) { if(exponent == 0) { return 1; } if(exponent == 1) { return base; } double result = power(base,exponent>>1); result *= result; if(exponent%2 == 1) re

HDU 3461 Code Lock(并查集+二分求幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3461 A lock you use has a code system to be opened instead of a key. The lock contains a sequence of wheels. Each wheel has the 26 letters of the English alphabet 'a' through 'z', in order. If you move a

题目1441:人见人爱 A ^ B(二分求幂)

题目链接:http://ac.jobdu.com/problem.php?pid=1441 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1441 人见人爱 A ^ B.cpp // Jobdu // // Created by PengFei_Zheng on 15/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include

一份对于求幂方法的总结

关于乘方 1.最基本的求幂方法(同于数据极弱的题): int temp=con; for(int i=2;i<=a;i++) temp*=con: 可以低效求出con的a次方. 例题:输入二个正整数a,b,求a^b的值. #include<iostream> using namespace std; int main() { int a,b; scanf("%d%d",&a,&b); int temp=a; for(int i=2;i<=b;i+

NYOJ--102--次方求模(快速求幂取模)

次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100)每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000) 输出 输出a的b次方对c取余之后的结果 样例输入 3 2 3 5 3 100 10 11 12345 12345 样例输出 3 1 10481 1 /* 2 Name: NYOJ--102--次方求模 3 Copyright: ?

整数求幂

问题描述:求一个整数的n次幂,对m取余. 思路一:简单循环 1 int Pow(int num, int n, int m) 2 { 3 int res = 1; 4 5 while (n--) { 6 res *= num; 7 } 8 9 return res % m; 10 } 以上代码有个隐患,当n足够大的时候,res会溢出,因此需要优化. 有这样一个公理:两个数的积对另一个数取余,等于这两个数分别对第三个数取余的乘积再对第三个数取余.也就是a*b%c = (a%c)*(b%c)%c 根

快速求幂模

今天我要介绍的是快速求幂模,在开始介绍之前,我们先看看如何快速求幂.这里我要介绍的是二分求幂. 二分求幂的原理如下: 下面,我们将这个公式转换成代码: int cifang(int a,int n)//返回值是a的n次方 { int res=1;//任何数的0次方都等于1,所以初始化为1 while(n != 0) { if(n%2 == 1)//如果n是奇数 res *= a;//就要多乘一次,即res = res*a; a = a*a; n /= 2;//二分,即n = n/2 } retu