📌  相关文章
📜  查找大数的a ^ b的最后一位数字

📅  最后修改于: 2021-05-04 16:49:20             🧑  作者: Mango

您将获得两个整数,即基数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
算法 :

  1. 由于数字很大,因此我们将它们存储为字符串。
  2. 取基数a的最后一位数字。
  3. 现在计算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