2 ^ n的最后一位数而不计算数字。 n =(0,1000000)或更大。
答案 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);
}
}
实际上有多大并不重要。所需要的只是知道它是否为零,以及最后两位。