[英]Last digit in an exponent - wrong answer - C#
我正在尝试解决此问题: http : //www.spoj.com/problems/LASTDIG/ ,它需要一个底数和指数,我必须输出取幂结果的最后一位,但是在线法官说我的程序虽然给出了错误的答案,但是对于典型的测试用例,我的输出是正确的。
注意:我必须使用快速模幂运算,对此有一个很好的解释: 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
每个功率以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);
}
}
}
}
您不应强求解决方案。 问题专门要求结果的最后一位数字 ,而不是全部。
乘法中应该有某种可以滥用的模式。 让我们暂时将功率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];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.