人见人爱A^B

这题和上一个快速幂取模有什么区别。。。
题目如下:
Problem Description

求A^B的最后三位数表示的整数。

说明:A^B的含义是“A的B次方”

Input

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

Output

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

Sample Input

2 3

12 6

6789 10000

0 0

Sample Output

8

984

1

解析可以参照这个链接的博客:

https://blog.csdn.net/qq_45539440/article/details/104916450

题目叫Rightmost Digit
我这里直接把这道题代码发出来了,改了几行代码就交上去了
#include <stdio.h>
void qpmod(long long a,long long b){
 long long c=1000,ans=1;
 while(b!=0){
  if(b&1)
   ans=(ans*a)%c;
        a=(a*a)%c;
  b>>=1;
 }
 printf("%lld\n",ans);
}
int main(){
 long long a,b,sum=0;
 while(1){
  scanf("%lld %lld",&a,&b);
  if(a==0&&b==0) break;
  qpmod(a,b);
 }
}
不知道这个还能不能偷鸡(手动滑稽)~~
但是解析不能就这么水了:
这里用了一次二分法:(一定要用C++交答案!!!)
讲一下原理:(这是个求幂的方法)
当你所求的目标为a^b 的后三位时,我们可以不必计算a^b, 比如计算5^31 ,那么原式=5^1 * 5^2 * 5^4 5^8 * 5^16 =5(2^0 + 2^1 + 2^2 + 2^3 + 2^4)我们只需要将b拆解成以2为底的等比数列的和即可,你可以将b看成一个二进制数的思想,每次利用b%2和b/=2来对其末位进行数位拆解,并将每一种拆解下得到的结果进行累乘,当b拆解完毕之后便可以得到答案。
代码如下:
#include <stdio.h> 
int main(){
    int a,b;
    int ans = 1;
    while(1){
     scanf("%d%d",&a,&b);
        if(a==0&&b==0)break;
        a=a%1000;
        ans = 1;
        for(int i=1;i<=b;i++){
            ans = ans*a;
            ans %= 1000;
        }
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值