C++:在优化结束时计数零
Posted
技术标签:
【中文标题】C++:在优化结束时计数零【英文标题】:C++: Counting zeros at the end optimization 【发布时间】:2013-04-02 12:04:20 【问题描述】:我正在尝试解决在任何自然数的阶乘末尾计算 0 的标准问题。我的代码工作正常,但在线判断给出“超出时间限制”错误。决定在这里询问我如何优化我的代码。
#include <iostream>
using namespace std;
int count (int n)
int result = 0;
for (unsigned int i = 5; i <= n; i += 5)
int temp = i;
while (!(temp % 5))
++result;
temp /= 5;
return result;
int main()
int N;
cin >> N;
cin.get();
for (unsigned int i = 0; i < N; ++i)
int n;
cin >> n;
cin.get();
cout << count (n) << endl;
return 0;
提前致谢。
【问题讨论】:
您可能需要***.com/questions/11889999/… 之类的东西吗? 您将 unsigned int 分配给 int。将所有 int 更改为 uint 真的比将 int 分配给 int 或 unsigned int 分配给 unsigned int 需要更多时间吗? @KudayarPirimbaev:int
到 unsigned int
是“免费的”,因为按位表示按原样复制。令人惊讶的是,按位表示具有不同的含义,具体取决于您何时陷入只能由两者之一(通常为负值)表示的值。
【参考方案1】:
试试这个:
int count (int n)
int result = 0;
for (unsigned int i = 5; i <= n; i *= 5)
result += n / i;
return result;
在1*2*..*N
中,有N/5
因子,可以被5
整除。其中N/25
也可以被25
整除,...
【讨论】:
【参考方案2】:您不必检查每个可被 5 整除的数字。相反,您可以用简单的系列数 5:
count = n div 5 + n div 25 + n div 125...
【讨论】:
以上是关于C++:在优化结束时计数零的主要内容,如果未能解决你的问题,请参考以下文章
C++ String的引用计数写时复制 的实现 《More Effective C++》