简单数学训练-B

来源:互联网 发布:海报设计制作软件 编辑:程序博客网 时间:2024/04/29 21:17

Description

Given a positive integer N, you should output the most right digit of N^N. 
 

Input

The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single positive integer N(1<=N<=1,000,000,000). 
 

Output

For each test case, you should output the rightmost digit of N^N. 
 

Sample Input

234
 

Sample Output

76

Hint

 In the first case, 3 * 3 * 3 = 27, so the rightmost digit is 7. In the second case, 4 * 4 * 4 * 4 = 256, so the rightmost digit is 6. 

通常循环超时, 本题利用尾数循环规律。

#include <stdio.h>int main(){    int T;    scanf("%d", &T);    while (T--){        int n, num, op ;        scanf("%d", &n);        num = n % 10;        int flag[10] ={1,1,4,4,2,1,1,4,4,2};        int i, p;        if (n >= flag[num] && (n % flag[num]) )            p = n % flag[num];        else if  (n >= flag[num] && !(n % flag[num]))            p = flag[num];        else p = n;//        printf("p = %d\n", p);        op = 1;        for ( i = 1; i <=  p; i++){            if (op > 10){                op = op % 10;                op *= num;            }            else op *= num;        }        op = op % 10;        printf("%d\n", op);        }}


快速幂带取余做法
#include <stdio.h>int fastpow(int x, int n,int mods) //快速幂带取余,非递归--不调用自身
{
    int sum = 1;    while (n > 0) {        if (n & 1){      // n & 1 等价于 (n % 2) == 1            x = x % mods;            sum *= x;            sum = sum % mods;            n-- ;        }        else {            x = x % mods;            x *= x;            x = x % mods;            n /= 2;        // n >>= 1 等价于 n /= 2        }    }    sum = sum % mods;    return sum;}int main(){    int n,a,b,ends;    scanf("%d", &n);    while (n--){        scanf("%d", &a);        b = a;        ends = fastpow(a,b,10);        printf("%d\n", ends);    }}




0 0