题目出自杭电
代码不长,但如果真要自己想的话要想好久,
法一:循环分部取余
1.这种方法适用于 a^n%m 类型
2.适用于n比较小的情况,n太大的话,循环结构会受不鸟。。。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, m, cont;
while (~scanf("%d%d", &n, &m) && (n || m))
{
cont = 1;
while (m--)
cont = (cont*n) % 1000;
printf("%d\n", cont);
}
system("pause");
return 0;
}
法二:对指数n进行二分
1. 当 n为偶数时,就会有a^n%m= a^(n/2)%m
当n为奇数时a^n%m=a^(n/2)%m * a%m
#include <stdio.h>
int f(int a, int n){
if(n == 0) return 1;
if(n == 1) return a;
if(n & 1) return f(a * a % 1000, n / 2) * a % 1000;//n&1等效于 n%2==1,奇数的情况
else return f(a * a % 1000, n / 2) % 1000; //偶数的情况
}
int main(){
int a, n;
while(scanf("%d %d", &a, &n), a || n)
{
printf("%d\n", f(a, n));
}
return 0;
}