【问题标题】:simple Greatest divisor problem c++ implementation throws Time-Limit Exceeded简单的最大除数问题 C++ 实现抛出 Time-Limit Exceeded
【发布时间】:2019-09-18 16:58:14
【问题描述】:

我正在向我大学的测试人员提交代码,我的代码完全适用于我提供的测试用例。

checker抛出Time-Limit Exceeded错误,我在visual studio中测试,和在线judge编译器完全兼容。

#include <iostream>
#include <math.h>
using namespace std;

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int i, n, gd; cin >> n;
    gd = 1;
    if (n > 1) {
        for (i = 2; i < n; i++)
        {
            if (n % i == 0)
            {
                gd = i;
            }
        }
        cout << gd;
    }

    return 0;
}
}

我找不到它为什么会抛出这样的错误。谢谢

代码只能在我的 Visual Studio 中运行,但无法通过测试。检查器顺便隐藏了测试用例。

【问题讨论】:

  • 如果代码工作正常,并且您只想提高其性能,请考虑在codereview.stackexchange.com 上询问而不是 SO。 “我找不到它为什么会抛出这样的错误。”通常,如果执行代码的时间更长,那么自动检查系统会显示此错误,即最大允许时间。
  • 如果您不被禁止使用标准库,std::gcd 可能会有所帮助。
  • 找到最小的除数,然后将n除以它得到最大的除数。它会明显更快。当你找到第一个除数时,你可以停止循环,或者你到达 sqrt(n)。
  • @interjay 即使是n,答案也是n/2
  • @MaximEgorushkin 是的,但不需要特殊情况。在这种情况下,最小的除数是 2,所以最大的除数是 n/2。

标签: c++ arithmetic-expressions


【解决方案1】:

不要寻找最大的除数,而是寻找最小的除数d(其中d &gt; 1)。那么最大的除数是n/d

你可以用一个简单的循环来做到这一点,就像你在找到第一个除数时使用的 breaks 一样。循环可以在通过sqrt(n) 时停止,在这种情况下,数字是素数。

这在最坏的情况下会更快,因为它将迭代次数限制为 sqrt(n)。而在d 很小的常见情况下,它只需要很少的操作。

【讨论】:

  • @Papa 循环将从 2 运行到 sqrt(n)。在 n=3 的情况下,sqrt(n) 小于 2,所以循环什么也不做。
猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 2022-11-07
  • 2010-11-09
  • 2020-09-18
相关资源
最近更新 更多