C# SPOJ上的FCTRL-阶乘
谁能帮我解决我犯了什么错误?这只是计算数字阶乘的尾随零的一个简单问题 输出在Ideone上成功运行,但出于某些原因 “回答错误” 在SPOJ的编译器上 有人能指出我犯的错误吗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; 最终价值+=价值
使用系统;
公开课考试
{
公共静态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;
}