C++ 快速幂取模

例如(7^7)%4

可以看为

((7%4)^7)%4

(3^7)%4

(((3*3)%4)^6)%4

(1^6)%4

(1^(2*3))%4   // 就像将(7^16)变成(49^8)

(1^3)%4.......

下面是对应代码 :a为底数,b是指数,m是要准备取模的数

long long Mode(long long a,long long b,long long m)

{
    long long sum=1;
    a=a%m;
    while(b>0)
    {
        if(b%2==1)
        {
            sum=(sum*a)%m;
        }
        b/=2;
        a=(a*a)%m;
    }
    return sum;
}

  同理,如果只是需要求a^b,那么不在每步上取模就可以了。

HDU2035

人见人爱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  789 10000 0 0

Sample Output

8 984 1

明显需要快速幂的运算,但是题目要求只输出结果的最后三位数字,那么在每一步上对1000取模即可!

import java.util.*;
public class Main {
	public static long fun(int n1,int n2) {
		long sum=1;
		while(n2>0) {
			if(n2%2==1)
			{
				sum=(sum*n1)%1000;
			}
			n2/=2;
			n1=(n1*n1)%1000;
		}
		return sum;
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()) {
			int n=sc.nextInt(),m=sc.nextInt();
			if(n==0&&m==0)
				break;
			long ans=fun(n,m);
				System.out.println(ans);
			}
		}
	}

猜你喜欢

转载自blog.csdn.net/slience_646898/article/details/82792960