最佳答案
我试图从 www.spoj.com: 阶乘解决这个问题
你不必真的去读它,如果你好奇的话就去读吧:)
首先,我在 C + + 中实现了它(这是我的解决方案) :
#include <iostream>
using namespace std;
int main() {
unsigned int num_of_inputs;
unsigned int fact_num;
unsigned int num_of_trailing_zeros;
std::ios_base::sync_with_stdio(false); // turn off synchronization with the C library’s stdio buffers (from https://stackoverflow.com/a/22225421/5218277)
cin >> num_of_inputs;
while (num_of_inputs--)
{
cin >> fact_num;
num_of_trailing_zeros = 0;
for (unsigned int fives = 5; fives <= fact_num; fives *= 5)
num_of_trailing_zeros += fact_num/fives;
cout << num_of_trailing_zeros << "\n";
}
return 0;
}
我把它作为 G + + 5.1的解决方案上传了
但是后来我看到一些评论声称它们的时间执行小于0.1。因为我想不出更快的算法,所以我尝试在 C中实现相同的代码:
#include <stdio.h>
int main() {
unsigned int num_of_inputs;
unsigned int fact_num;
unsigned int num_of_trailing_zeros;
scanf("%d", &num_of_inputs);
while (num_of_inputs--)
{
scanf("%d", &fact_num);
num_of_trailing_zeros = 0;
for (unsigned int fives = 5; fives <= fact_num; fives *= 5)
num_of_trailing_zeros += fact_num/fives;
printf("%d", num_of_trailing_zeros);
printf("%s","\n");
}
return 0;
}
我把它作为 Gcc 5.1的解决方案上传了
现在代码是 几乎一样,我按照建议的 给你将 std::ios_base::sync_with_stdio(false);
添加到 C + + 代码中,以关闭与 C 库的 stdio 缓冲区的同步。我还将 printf("%d\n", num_of_trailing_zeros);
分割成 printf("%d", num_of_trailing_zeros); printf("%s","\n");
,以补偿 cout << num_of_trailing_zeros << "\n";
中 operator<<
的双重呼叫。
但是我仍然看到了在 C 语言和 C + + 代码中 X9更好的性能和更低的内存使用。
为什么?
剪辑
我用 C 代码把 unsigned long
改成了 unsigned int
。它应该是 unsigned int
和结果,上面显示的是相关的新(unsigned int
)版本。