C# SPOJ上的FCTRL-阶乘

C# SPOJ上的FCTRL-阶乘,c#,algorithm,C#,Algorithm,谁能帮我解决我犯了什么错误?这只是计算数字阶乘的尾随零的一个简单问题 输出在Ideone上成功运行,但出于某些原因 “回答错误” 在SPOJ的编译器上 有人能指出我犯的错误吗 使用系统; 公开课考试 { 公共静态void Main(字符串[]args) { int numberOfValues=int.Parse(Console.ReadLine()); int[]值=新的int[numberOfValues]; for(int i=0;i 5;i++) { 数值=数值/5; 最终价值+=价值

谁能帮我解决我犯了什么错误?这只是计算数字阶乘的尾随零的一个简单问题

输出在Ideone上成功运行,但出于某些原因

“回答错误”

在SPOJ的编译器上

有人能指出我犯的错误吗

使用系统;
公开课考试
{
公共静态void Main(字符串[]args)
{
int numberOfValues=int.Parse(Console.ReadLine());
int[]值=新的int[numberOfValues];
for(int i=0;i 5;i++)
{
数值=数值/5;
最终价值+=价值;
}
返回最终值;
}
}

您可能会遇到内存不足错误。您不需要
int[]值
。您可以在读取数字后立即计算阶乘。您不需要
控制台.ReadKey()。请注意,我还没有检查
calculateAct
的正确性

正如Dmitry所指出的,你的函数是错误的。。。你“一个一个地离开”:

请参阅
=
?但是,通过删除
i
变量,可以稍微加快速度

static int calculateFact(int value)
{
    int finalValue = 0;

    while (true)
    {
        value /= 5;

        if (value == 0)
        {
            return finalValue;
        }

        finalValue += value;
    }
}

这应该是正确的,但我不确定它是否足够快(通常SPOJ问题是基于“缓存”数据)

现在正是实施和运行一些测试以找出“错误答案”的时候了:

当有反例时,例如
calculateFact(5)
case,很容易调试。你现在能看到问题了吗?它位于
for
循环中:

for (int i = 0; value > 5; i++)
应该是(
=
而不是

编辑:从技术上讲,您所要做的就是检查
5
的权限:

static int calculateFact(int value) {
  int result = 0;

  // 13 loops = floor(log(2**31)/log(5))
  for (int power5 = 5; power5 <= int.MaxValue / 5; power5 *= 5) 
    result += value / power5;

  return result;
}
static int calculateFact(int值){
int结果=0;
//13圈=地板(对数(2**31)/对数(5))

对于(int power5=5;power5您得到的错误是什么?您正在解决的初始任务/问题是什么?给定
N
找出
N!
的尾随零的数量?@asharistava它说“错误答案”@DmitryBychenko是的。输入一个数字“N”并找到N的尾随零!您能否尝试对值进行硬编码以检查您的逻辑是否正确。
using System.Linq;
using System.Numerics;

...

// Slow, ugly but easy to understand and check routine
static int naiveCount(int value) {
  BigInteger factorial = 1;

  for (int i = 1; i <= value; ++i)
    factorial *= i;

  return factorial.ToString().Length - factorial.ToString().TrimEnd('0').Length;
}

...

var counterExamples = Enumerable
  .Range(0, 100)
  .Select(v => new {
     value = v,
     actual = calculateFact(v),
     expected = naiveCount(v), })
  .Where(item => item.expected != item.actual)
  .Select(item => $"value: {item.value,4} actual: {item.actual,3} expected: {item.expected,3}");

Console.Write(string.Join(Environment.NewLine, counterExamples));
value:    5 actual:   0 expected:   1
value:   25 actual:   5 expected:   6
value:   26 actual:   5 expected:   6
value:   27 actual:   5 expected:   6
value:   28 actual:   5 expected:   6
value:   29 actual:   5 expected:   6
for (int i = 0; value > 5; i++)
for (int i = 0; value >= 5; i++)
static int calculateFact(int value) {
  int result = 0;

  // 13 loops = floor(log(2**31)/log(5))
  for (int power5 = 5; power5 <= int.MaxValue / 5; power5 *= 5) 
    result += value / power5;

  return result;
}