T^T(1)

简介: T^T(1)

看题请戳这儿

2.png


解题思路:通读全文即得,让求t的t次方,在求出个位上的数字。

首先~一开始的思路是对该数t取个位数在求t次方,在求个位数。结果数字爆炸了,超过了int整型数的范围。因此pass掉!

其次~找规律,然后发现个位数为0,1,5,6的时候,结果都与个位数一样。其他情况则存在循环:2【2,4,8,6,】;3【3,9,7,1】;4【4,6,46】;7【7.9.3.1】;8【8,4,2,6】;9【9,1,9,1】。 代码如下:

#include<stdio.h>
int main()
{
    int a,b,c;
    int l[40] = {0,0,0,0,1,1,1,1,6,2,4,8,1,3,9,7,6,4,6,4,5,5,5,5,6,6,6,6,1,7,9,3,6,8,4,2,1,9,1,9};
    while(scanf("%d",&a) != EOF)
    {
        b = a % 10;
        c = a % 4;
        printf("%d\n",l[b*4+c]);
        }
    return 0;
}

最后~快速幂的方法也可以解决这个问题。毛女神的代码如下:

def powmod(a,b):
    a %= 10
    res = 1
    while(b):
        if b & 1:
            res = res * a % 10
        b >>= 1
        a = a * a %20
    return res
try:
    while True:
        n = int(input())
        print(powmod(n,n))
except:
    pass

PS:介绍一下快速幂, 当我们求a^ b时,其实b是可以拆成二进制的,该二进制数第i位的权为2^ (i-1),例如当b==11时,a^ 11=a^ (2^ 0+1^ 2+2^ 3)。 11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a^ (2^ 0)*a^ (2^ 1)*a^ (2.^3) 。由于是二进制,就想到“位运算”: & 和 >> ,&运算通常用于二进制取位操作,&1就是取最后一位。>>运算比较单纯,二进制去掉最后一位,即除一个2。代码如下:

int poww(int a,int b){
    int ans=1,base=a;
    while(b!=0){
        if(b&1!=0)
          ans*=base;
        base*=base;
        b>>=1;
  }
    return ans;
}
相关文章
|
2月前
学习使用按位异或 ^
学习使用按位异或 ^。
17 2
|
10月前
|
算法
异或^符号的使用
异或^符号的使用
54 0
|
11月前
|
C++
求n^k的前三位数和后三位数(log 10……)
求n^k的前三位数和后三位数(log 10……)
|
算法
a^b(快速幂)
题目: 求 a 的 b 次方对 p 取模的值。 输入格式: 三个整数 a,b,p ,在同一行用空格隔开。 输出格式: 输出一个整数,表示a^b mod p的值。
61 0
|
算法 C++
(1+2+...+100)+(1^2+2^2+...+50^2)+(1/1+1/2+...+1/10)
(1+2+...+100)+(1^2+2^2+...+50^2)+(1/1+1/2+...+1/10)
HDOJ 2035 人见人爱A^B
HDOJ 2035 人见人爱A^B
112 0