50分追加100分!高分求解答,读这三行程序是什么意思,并且做详细解释

高次方尾数

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 }

温馨提示:答案为网友推荐,仅供参考
相似回答