最后一位数为2 ^ n

时间:2018-01-25 18:34:40

标签: c#

2 ^ n的最后一位数而不计算数字。 n =(0,1000000)或更大。

2 个答案:

答案 0 :(得分:5)

如果你看一下两个权力的顺序,你将会看到一个模式:

1 2 4 8 16 32 64 128 256 512 1024 2048

它总是2 - > 4 - > 8 - > 6

您可以使用它来计算最后一位数

int GetLastDigit(int power)
{
    if (power == 0) return 1;
    switch ((power - 1) % 4)
    {
        case 0: return 2;
        case 1: return 4; 
        case 2: return 8; 
        case 3: return 6;
        default: return -1; //negative power.
    } 
}

BigInteger版本:

static int GetLastDigit(BigInteger power)
{
    if (power == 0) return 1;
    switch ((int)((power - 1) % 4)) //you can cast it, because it will always be less than 4
    {
        case 0: return 2;
        case 1: return 4;
        case 2: return 8;
        case 3: return 6;
        default: return -1; //negative power. 
    }
}

答案 1 :(得分:-2)

最简单的方法是:

public static int LastDigit(int n)
{
    var last = n %4;
    return (int)Math.Pow(2, last) + (last == 0 && n != 0 ? 5 : 0);
}

所以,基本上,你只需要获取电源的最后一个字节(最后2位)并检查整数是否为零。答案可以编码为3位。

大数字的更通用方法(以BigEndian表示):

public static int LastDigit(byte[] n)
{
    var last = n[n.Length - 1] %4;
    return (int)Math.Pow(2, last) + ((last == 0 && !(n.Length == 1 && n[0] == 0)) ? 5 : 0);
}

所以,对于BigInteger:

class Program
{
    static void Main(string[] args)
    {
        var pow = new BigInteger(12);
        var value = Math.Pow(2, (int)pow);
        var lastDigit = LastDigit(pow.ToByteArray());
    }

    public static int LastDigit(byte[] n)
    {
        var last = n[n.Length - 1] %4;
        return (int)Math.Pow(2, last) + ((last == 0 && !(n.Length == 1 && n[0] == 0)) ? 5 : 0);
    }
}

实际上有多大并不重要。所需要的只是知道它是否为零,以及最后两位。