C# 2^n的最后一位

C# 2^n的最后一位,c#,C#,不计算数字的2^n的最后一位。 n=01000000或更大。如果你看二次幂的顺序,你会发现一个模式: 一, 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;

不计算数字的2^n的最后一位。
n=01000000或更大。

如果你看二次幂的顺序,你会发现一个模式:

一, 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. 
    }
}

最简单的方法是:

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);
    }
}

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

如果不进行计算,您将无法知道答案。如果你已经进行了计算,那么你已经将结果存储在某个地方了。二进制文件中,它总是0-我们在这里讨论的是计算机,所以你可能want@Marius98你应该看看我的答案,不然别太含糊了。Int32可以高达20亿。@LordWilmore这并不总是正确的:您有时可以计算部分结果;但这是一个数学问题,而不是一个编程问题。马吕斯,我建议你问自己这个问题,不要考虑编程。相反,我在纸上怎么做呢?这是对的,但不是我要搜索的。你想要的是数字的最后一位。@Marius98你的问题明确地说n在0,1000000的范围内。一百万适合一个整数。然而,我们有实际的证据证明这一点吗,我的意思是,数学充满了实证结果,结果证明是错误的。也许math.stackexchange会知道better@pm100任何这样的循环都是我们的10位数基数系统与2的幂相互作用的结果。这应该不难证明。这基本上是@rokkerboci answerNope的一个更复杂的版本,这个版本实际上接受BigInteger。不过,我想得越多,我就越有信心他给出的是一个字符串而不是BigInteger。所以,他基本上需要最后两个角色。我可以写扩展,但它看起来很难看。就像任何布尔/离散数学一样。不过,这已经很难看了。