指数中的最后一位数 - 错误答案 - C#

时间:2016-06-08 17:31:37

标签: c# algorithm

我试图解决这个问题:http://www.spoj.com/problems/LASTDIG/它需要一个基数和指数,我必须输出指数结果的最后一位数,但在线判断说我的程序给出了错误的答案测试用例,我的输出是正确的。

N.B。:我必须使用Fast Modular Exponentiation算法,这里有一个很好的解释:https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/fast-modular-exponentiation

using System;

public class Test
{
    public static void Main()
    {
        int val = Convert.ToInt32(Console.ReadLine());
        for (int i=0; i<val; i++ )
        {
            string input = Console.ReadLine();
            int a = Convert.ToInt32(input.Split()[0]);
            int b = Convert.ToInt32(input.Split()[1]);
            if (a==0)
            {
                Console.WriteLine(0);
            } else if(b==0)
            {
                Console.WriteLine(1);
            } else {
                a=a%10;
                string bToBinary=Convert.ToString(b, 2);
                double temp = 1;
                for(int j=bToBinary.Length-1, k=0; j>=0; j--, k++)
                {
                    if (bToBinary[j] == '1')
                    {
                        temp = temp*(Math.Pow(a, Math.Pow(2, k)));
                    }
                }
                Console.WriteLine(temp%10);
            }
        }
    }
}

示例输入:

4
3 10
6 2
14 11
1 0

该计划的输出:

9
6
4
1

2 个答案:

答案 0 :(得分:2)

每一种力量都以1,2或4重复。

这是写出来的模式

1 = {1,1,1,1}
2 = {2,4,8,6}
3 = {3,9,7,1}
4 = {4,6,4,6}
5 = {5,5,5,5}
6 = {6,6,6,6}
7 = {7,9,3,1}
8 = {8,4,2,6}
9 = {9,1,9,1}

正如您已经知道具有相同单位的权力模式,例如13的模式与3

的模式相同

所以你应该能够编写你的程序

public class Test
{
    public static void Main()
    {
        int val = Convert.ToInt32(Console.ReadLine());
        for (int i=0; i<val; i++ )
        {
            string input = Console.ReadLine();
            int a = Convert.ToInt32(input.Split()[0]);
            int b = Convert.ToInt32(input.Split()[1]);
            if (a==0)
            {
                Console.WriteLine(0);
            } else if(b==0)
            {
                Console.WriteLine(1);
            } else {
               Console.WriteLine (Math.Pow(a%10,b%4 + 4) %10);  
            }
        }
    }
}

答案 1 :(得分:0)

你不应该强行解决问题。问题特别要求结果的最后一位,而不是整个事情。

在你可以滥用的乘法中应该存在某种模式。 让我们暂时降低功率0,因为这是一个特定的边缘情况。例如,我们知道任何正整数的10或20的幂将以0和5结束将永远以5结尾。我们可以滥用这种模式,因为无论我们多少次提高功率,最后一位数字总是在这种模式中。

模式可以这样提取:

IEnumerable<int> FindExpLastDigitPattern(int i)
{
    var result = 1;

    var list = new List<int>();
    while (!list.Contains(result = (result * i) % 10))
    {
        list.Add(result);
        yield return result;
    }
}

我们还可以根据幂index = (power - 1) % pattern.Count来预测此模式中的位置。

考虑到这一点,我们可以计算取幂的最后一位数:

int ComputeLastDigitOfExponentiation(int i, int power)
{
    // arguments guard...

    // handles specific case
    if (power == 0)  return 1;

    var pattern = FindExpLastDigitPattern(i).ToList();

    return pattern[(power - 1) % pattern.Count];
}