高次方尾数
Description
求x的y次方的最后k位数。
Input第一行包含一个整数n(1≤n≤100),表示测试用例的个数。每个测试用例的输入有一行,整数x,y,k。其中,0<x≤1000,0≤y≤1000; 0<k≤4;
Output对每个测试用例输出一行。输出x的y次方的最后k位数(忽略前导0)。
Sample Input
2
2 10 3
10 1000 4
Sample Output
240
HINT
注意:高次方的结果会超过32位二进制整数的表示范围。
这道题的代码应该是这样的,
不过我对于其中几行代码不太理解,还请大家不吝赐教。
1 #include<stdio.h>
2 int cal(int x, int y, int k)
3 {
4 static e[] = {1, 10, 100, 1000, 10000};
5 int r;
6 if(y == 0) return 1;
7 r = cal(x, y >> 1, k);
8 r = r * r % e[k];
9 if(y & 1) r = r * x % e[k];
10 return r;
11 }
12 int main()
13 {
14 int n, x, y, k;
15 for(scanf("%d", &n); n--;)
16 {
17 scanf("%d%d%d", &x, &y, &k);
18 printf("%d\n", cal(x, y, k));
19 }
20 return 0;
21 }
第7~第9行不太理解,
第7行为什么还要使用cal函数?为什么cal中还得对y进行位运算?
第8行也不太懂。。。
第9行括号中位运算(y&1)的作用是什么?而r = r * x % e[k] 又是什么意思?
答得好追加100分
2 int cal(int x, int y, int k) //求x的y次方的最后k位数
3 {
4 static e[] = {1, 10, 100, 1000, 10000};
5 int r;
6 if(y == 0) return 1; //若是0次方,答案是1
7 r = cal(x, y >> 1, k); //求x的(y/2)次方的最后k位数r
8 r = r * r % e[k]; //求r平方的最后k位数
9 if(y & 1) r = r * x % e[k]; //若y是奇数则答案是r*x的最后k位数
10 return r;
11 }