您的位置:首页 > 其它

人见人爱A^B

2016-04-05 21:35 330 查看
题目出自杭电



代码不长,但如果真要自己想的话要想好久,

法一:循环分部取余

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: