Python 使用memonization,但代码仍然永远运行

Python 使用memonization,但代码仍然永远运行,python,c,algorithm,recursion,memoization,Python,C,Algorithm,Recursion,Memoization,我正在尝试解决SPOJ问题“”。我用python和c编写了代码。在python中,输入0.0/0 300大约需要2秒。但在C语言中,它永远运行。C语言中的代码正在为一些较小的测试用例(如19.50/01)运行 问题在于您对scanf的使用。它将空格或换行符视为输入的终止符。很可能是在每次输入后键入enter。但是,问题是它将\n保留在缓冲区中,并将其传递给下一个输入 如果您没有使用严格的c,可以调用 fflush(stdin); cin.ignore() 每次scanf呼叫后。我在您的代码上

我正在尝试解决SPOJ问题“”。我用python和c编写了代码。在python中,输入0.0/0 300大约需要2秒。但在C语言中,它永远运行。C语言中的代码正在为一些较小的测试用例(如19.50/01)运行


问题在于您对scanf的使用。它将空格或换行符视为输入的终止符。很可能是在每次输入后键入enter。但是,问题是它将\n保留在缓冲区中,并将其传递给下一个输入

如果您没有使用严格的c,可以调用

fflush(stdin);
cin.ignore()

每次scanf呼叫后。我在您的代码上尝试了它,并且能够获得成功的输出

或者,你也可以打电话

fflush(stdin);
这可能也有帮助


我想这里应该归咎于递归。代码确实适用于较小的目标。如果可能的话,去掉递归

目标较小:

输入

输出

100.00
99.99

您的问题是递归的很多结果都是0,所以

if(ans[wickets][balls][reqRuns]!=0)
    return ans[wickets][balls][reqRuns];
在许多情况下无法返回缓存的结果,因此您正在重新计算many-many结果,而Python中saved中的check
f会阻止重新计算相同的值

我更改了您的C代码,将
ans
的初始条目设置为包含负数(如果您知道平台的浮点表示形式为IEEE754,只需更改为
memset(ans,0x80,sizeof ans);
即可),并将该条件替换为

if (ans[wickets][balls][reqRuns] >= 0)
并立即得到了结果:

$time./a.out
您调试代码了吗?是
返回ans[…][…][…]行是否执行过?在C中直接比较浮动通常不是一个好主意。是的,它正在被执行。我使用eclipse进行了调试,并仅在这一行设置了断点。对于其他几种情况,我得到了正确的ans。所以这不是一个问题。为了克服这个问题,我在readscore函数的第三行使用getchar来读取任何空格,然后您应该复制至少一个失败的测试用例。这对于你的问题来说是至关重要的信息,我相信如上所述,如果(ans[wickets][balls][reqRuns]!=0)返回ans[wickets][balls][reqRuns],这就是问题所在;ans是一个浮点数,因此即使其值为0.0000,也不会等于0。你可能有几个案子能挺过来,但不是每个案子都能挺过来。键入cast this to integer或进行类似于float-0<0.000的比较,以确保我在问题中明确提到了它。它没有运行0.0 0/0 300。对于案例19.5 0/0 1,它运行并返回正确的ans。您所讨论的方式是:它在python中运行,但在c中永远运行。听起来不像是c的成功案例。以上是用相同算法(使用递归)在python中运行的代码,我认为这不应该是一个问题。感谢您指出错误。我纠正了它,现在它运行良好。但是这种情况下正确的ans是18.02而不是18.03。即使通过python代码,我也得到了18.03。输出规范说“注意:它的表示形式的前两位小数应该不舍入地打印,
%.2f
舍入”。结果是
18.027…
。哦!这对我来说是一个新的信息。2f四舍五入!!我应该将其转换为字符串并打印到2位小数还是有更好的方法?解决了这个问题并获得了正确的测试用例输出,但在提交后仍然得到错误的ans。我现在很沮丧。我花了整整一天的时间,但仍然无法编写代码,尽管思考算法的时间非常少。请你检查一下我的新代码,告诉我是否遗漏了边缘案例之类的东西?也可能是同样的问题。如果精确(计算)结果为34.03972。。。它将四舍五入到小数点后的三位数,即39.040。您可以
sprintf
使用更多的数字,如果数字为10,则极不可能出现这种边缘情况(然后您就必须担心浮点错误累积)。或者您可以乘以100、
floor
、除以100或减去0.005(两者仍然需要
%.2f
)。所有这些都会导致一些边缘情况出错,但如果出现这些情况,您在操作准确性方面会遇到更大的问题(
*
+
)。
if(ans[wickets][balls][reqRuns]!=0)
    return ans[wickets][balls][reqRuns];
if (ans[wickets][balls][reqRuns] >= 0)