您将获得两个整数,即基数a(位数d,例如1 <= d <= 1000)和索引b(0 <= b <= 922 * 10 ^ 15)。您必须找到a ^ b的最后一位数字。
例子:
Input : 3 10
Output : 9
Input : 6 2
Output : 6
Input : 150 53
Output : 0
在举几个例子之后,我们可以注意到下面的模式。
Number | Last digits that repeat in cycle
1 | 1
2 | 4, 8, 6, 2
3 | 9, 7, 1, 3
4 | 6, 4
5 | 5
6 | 6
7 | 9, 3, 1, 7
8 | 4, 2, 6, 8
9 | 1, 9
在给定的表中,我们可以看到循环重复的最大长度为4。
例如: 2 * 2 = 4 * 2 = 8 * 2 = 16 * 2 = 32 32中的最后一位数字为2,这意味着在乘以4位数字后重复自己。因此该算法非常简单。
资料来源:Brilliants.org
算法 :
- 由于数字很大,因此我们将它们存储为字符串。
- 取基数a的最后一位数字。
- 现在计算b%4。这里b非常大。
- 如果b%4 == 0意味着b可以被4整除,那么我们的指数现在将是exp = 4,因为通过将数字乘以4来得到上图中根据循环表得出的最后一位数字。
- 如果b%4!= 0意味着b不能被4整除,那么我们的指数现在将是exp = b%4,因为通过乘以数字指数倍,我们可以根据上图中的循环表获得最后一位数字。
- 现在计算ldigit = pow(last_digit_in_base,exp)。
- a ^ b的最后一位数字为ldigit%10。
下面是上述算法的实现。
C++
// C++ code to find last digit of a^b
#include
using namespace std;
// Function to find b % a
int Modulo(int a, char b[])
{
// Initialize result
int mod = 0;
// calculating mod of b with a to make
// b like 0 <= b < a
for (int i = 0; i < strlen(b); i++)
mod = (mod * 10 + b[i] - '0') % a;
return mod; // return modulo
}
// function to find last digit of a^b
int LastDigit(char a[], char b[])
{
int len_a = strlen(a), len_b = strlen(b);
// if a and b both are 0
if (len_a == 1 && len_b == 1 && b[0] == '0' && a[0] == '0')
return 1;
// if exponent is 0
if (len_b == 1 && b[0] == '0')
return 1;
// if base is 0
if (len_a == 1 && a[0] == '0')
return 0;
// if exponent is divisible by 4 that means last
// digit will be pow(a, 4) % 10.
// if exponent is not divisible by 4 that means last
// digit will be pow(a, b%4) % 10
int exp = (Modulo(4, b) == 0) ? 4 : Modulo(4, b);
// Find last digit in 'a' and compute its exponent
int res = pow(a[len_a - 1] - '0', exp);
// Return last digit of result
return res % 10;
}
// Driver program to run test case
int main()
{
char a[] = "117", b[] = "3";
cout << LastDigit(a, b);
return 0;
}
Java
// Java code to find last digit of a^b
import java.io.*;
import java.math.*;
class GFG {
// Function to find b % a
static int Modulo(int a, char b[])
{
// Initialize result
int mod = 0;
// calculating mod of b with a to make
// b like 0 <= b < a
for (int i = 0; i < b.length; i++)
mod = (mod * 10 + b[i] - '0') % a;
return mod; // return modulo
}
// Function to find last digit of a^b
static int LastDigit(char a[], char b[])
{
int len_a = a.length, len_b = b.length;
// if a and b both are 0
if (len_a == 1 && len_b == 1 && b[0] == '0' && a[0] == '0')
return 1;
// if exponent is 0
if (len_b == 1 && b[0] == '0')
return 1;
// if base is 0
if (len_a == 1 && a[0] == '0')
return 0;
// if exponent is divisible by 4 that means last
// digit will be pow(a, 4) % 10.
// if exponent is not divisible by 4 that means last
// digit will be pow(a, b%4) % 10
int exp = (Modulo(4, b) == 0) ? 4 : Modulo(4, b);
// Find last digit in 'a' and compute its exponent
int res = (int)(Math.pow(a[len_a - 1] - '0', exp));
// Return last digit of result
return res % 10;
}
// Driver program to run test case
public static void main(String args[]) throws IOException
{
char a[] = "117".toCharArray(), b[] = { '3' };
System.out.println(LastDigit(a, b));
}
}
// This code is contributed by Nikita Tiwari.
Python3 # Python 3 code to find last digit of a ^ b
import math
# Function to find b % a
def Modulo(a, b) :
# Initialize result
mod = 0
# calculating mod of b with a to make
# b like 0 <= b < a
for i in range(0, len(b)) :
mod = (mod * 10 + (int)(b[i])) % a
return mod # return modulo
# function to find last digit of a ^ b
def LastDigit(a, b) :
len_a = len(a)
len_b = len(b)
# if a and b both are 0
if (len_a == 1 and len_b == 1 and b[0] == '0' and a[0] == '0') :
return 1
# if exponent is 0
if (len_b == 1 and b[0]=='0') :
return 1
# if base is 0
if (len_a == 1 and a[0] == '0') :
return 0
# if exponent is divisible by 4 that means last
# digit will be pow(a, 4) % 10.
# if exponent is not divisible by 4 that means last
# digit will be pow(a, b % 4) % 10
if((Modulo(4, b) == 0)) :
exp = 4
else :
exp = Modulo(4, b)
# Find last digit in 'a' and compute its exponent
res = math.pow((int)(a[len_a - 1]), exp)
# Return last digit of result
return res % 10
# Driver program to run test case
a = ['1', '1', '7']
b = ['3']
print(LastDigit(a, b))
# This code is contributed to Nikita Tiwari.
C#
// C# code to find last digit of a^b.
using System;
class GFG {
// Function to find b % a
static int Modulo(int a, char[] b)
{
// Initialize result
int mod = 0;
// calculating mod of b with a
// to make b like 0 <= b < a
for (int i = 0; i < b.Length; i++)
mod = (mod * 10 + b[i] - '0') % a;
// return modulo
return mod;
}
// Function to find last digit of a^b
static int LastDigit(char[] a, char[] b)
{
int len_a = a.Length, len_b = b.Length;
// if a and b both are 0
if (len_a == 1 && len_b == 1 &&
b[0] == '0' && a[0] == '0')
return 1;
// if exponent is 0
if (len_b == 1 && b[0] == '0')
return 1;
// if base is 0
if (len_a == 1 && a[0] == '0')
return 0;
// if exponent is divisible by 4
// that means last digit will be
// pow(a, 4) % 10. if exponent is
//not divisible by 4 that means last
// digit will be pow(a, b%4) % 10
int exp = (Modulo(4, b) == 0) ? 4
: Modulo(4, b);
// Find last digit in 'a' and
// compute its exponent
int res = (int)(Math.Pow(a[len_a - 1]
- '0', exp));
// Return last digit of result
return res % 10;
}
// Driver program to run test case
public static void Main()
{
char[] a = "117".ToCharArray(),
b = { '3' };
Console.Write(LastDigit(a, b));
}
}
// This code is contributed by nitin mittal.
PHP
Javascript
输出 :
3