九度OJ-1441:人见人爱 A^B(二分求幂)
2017-02-06 13:36
591 查看
此题涉及一个非常重要的算法:二分求幂。相对不好理解,消化如下:
关于二分求幂的原理见下图:
a^b,基本的思想是将b进行二进制转化。所以代码的主体是在b的二进制化的while循环上进行改造:
①b%2,b/2 //指数二进制化
②weight*=weight //计算二进制化后的指数的该位权重
③ans*=pow //将此位的计算结果累乘到最终结果上
完整代码如下:
题目地址:点击打开链接题目描述:
求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”
输入:
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
输出:
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
样例输入:
样例输出:
关于二分求幂的原理见下图:
a^b,基本的思想是将b进行二进制转化。所以代码的主体是在b的二进制化的while循环上进行改造:
while (b>0){ if (b%2==1){ ans*=weight; } b/=2; weight*=weight; }加红部分为二进制化的代码。故二分求幂的代码主体就是在做三件事:
①b%2,b/2 //指数二进制化
②weight*=weight //计算二进制化后的指数的该位权重
③ans*=pow //将此位的计算结果累乘到最终结果上
完整代码如下:
#include <iostream> using namespace std; int main(){ int a,b; int weight,ans; while (cin>>a>>b,a||b){ //initiate weight=a; ans=1; //calculate while (b>0){ if (b%2==1){ ans*=weight; ans%=1000;//结果只需最后三位 } b/=2; weight*=weight; weight%=1000;//结果只需最后三位 } //output cout<<ans<<endl; } return true; }
题目地址:点击打开链接题目描述:
求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”
输入:
输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=10000),如果A=0, B=0,则表示输入数据的结束,不做处理。
输出:
对于每个测试实例,请输出A^B的最后三位表示的整数,每个输出占一行。
样例输入:
2 3 12 6 6789 10000 0 0
样例输出:
8 984 1
相关文章推荐
- 【九度】题目1441:人见人爱 A ^ B (二分求幂)
- 【九度OJ】题目1441:人见人爱 A ^ B 解题报告
- 九度OJ题目1441:人见人爱 A ^ B
- 题目1441:人见人爱 A ^ B(二分求幂)
- 九度oj1443 矩阵乘法加二分求幂
- 九度OJ 二分求幂法、快速取模之《root(n,k)》
- 九度OJ 1442/HDU 2817 (二分求幂)
- 题目1441:人见人爱 A ^ B(二分求幂)
- 九度OJ 1085 求root(N, k) -- 二分求幂及快速幂取模
- 九度OJ 1085 求root(N, k) -- 二分求幂及快速幂取模
- HDU 2035 人见人爱A^B(二分求幂,快速求幂)
- 九度题目1441:人见人爱 A ^ B
- 九度OJ 1533 最长上升子序列 (基于贪心和二分查找)
- HDU 2035 人见人爱A^B(二分求幂,快速求幂)
- 九度OJ 1081 递推数列 -- 矩阵二分乘法
- 九度OJ月赛---题目1534:数组中第K小的数字 (二分搜索)
- 九度OJ 1081 递推数列 -- 矩阵二分乘法
- 九度OJ+贪心二分+最大值最小化都是这样做的。
- 九度OJ 1069 查找学生信息(二分查找)
- HDOJ 2035 人见人爱A^B-----二分快速求幂