【问题标题】:How can we compare the number was less than我们如何比较数字小于
【发布时间】:2012-02-28 16:04:44
【问题描述】:

编辑

我想得到自然数N的除数。

for (int i=1;i<n/2;i++)
 if(n%i==0)
    print(i);

我们如何比较小于 n/2 的数字? 我想在不到 n/2 步内找到所有因素

【问题讨论】:

  • 我删除了 Mathematica 标签,我认为它在这里不适用。
  • 对于初学者来说应该是 n%i==0。
  • 只是对下面谁做 i
  • 伙计们...如果您正在寻找所有因素,那么使用 sqrt(n) 是不正确的。
  • @John 请注意,在我的回答中,我将上升到sqrt(n),但是当我找到一个因素时会同时打印in/i。因此,它们都被找到了。 (检查i==sqrt(n) 以避免将完美平方的平方根打印两次。)

标签: c algorithm math complexity-theory


【解决方案1】:

如果我理解正确,您想确定i 是否小于n/2

试试这个:

if (i < n/2)
    print(i);

【讨论】:

  • 我认为 Ma 希望在不到 n/2 步内找到所有因素。
  • 啊,我觉得这有点简单。
【解决方案2】:

您实际上可以在sqrt(n) 步骤中执行此操作,如下所示:

for(int i = 1;i <= sqrt(n);i++)
{
  if(n % i == 0)
  {
    print(i);
    if(i != sqrt(n))
      print(n / i);
  }
}

这将打印n 的每个除数一次。请注意,就像在示例代码中一样,我假设了一个 print 函数,可以按如下方式实现:

void print(int i)
{
  printf("%d\n", i);
}

【讨论】:

  • @MaEb 它并不完全清楚你在寻找什么。这会正确打印n 的所有因子。对于n = 24,它打印1 24 2 12 3 8 4 6
【解决方案3】:

两者

for(int i=1;i<n;i++) 

for(int i=1;i<n/2;i++)

有效,但第二个更有效。一个数的除数不会超过它的一半。 例如,100 的因数肯定小于等于 50。

there 之外还有许多其他有效的算法。

【讨论】:

  • 你的意思是写第二个效率更高?
  • 如果你把你的想法更进一步,你可以选择 sqrt(n) 而不仅仅是 n/2。
  • 他不会进行素数计算。执行 sqrt(100),循环运行 i = 1 到 10,因此您错过了 50 等因素。
【解决方案4】:

如果我理解正确,您是在寻找某个数为 N 的所有除数?

试试这个:

for(int i=1;i<n/2;i++)
{
   if(n%i == 0)
    printf("%d\n",i);
}

【讨论】:

    【解决方案5】:

    尝试:

    for(int i=1;  i < (n/2); ++i)
        if (n%i==0)
             printf("%d\n",i);
    

    这个优化怎么样(你只需要平方根):

    for(int i=1;  i < sqrt(n); ++i)
        if (n%i==0)
            printf("%d\n",i);
    

    或者这个,你只覆盖奇数(如果你检查素数很有用):

    for(int i=1;  i < sqrt(n); i+=2)
        if (n%i==0)
             printf("%d\n",i);
    

    【讨论】:

    • 对于 16 这很糟糕。打印 1,2,4
    • 请注意,在您的最后一个示例中,n=26 只会打印 1。你不能跳过2 否则会是个问题。
    【解决方案6】:

    如何先进行除法并将其存储在一个变量中,以便在 FOR 循环的每次迭代中都不计算它:

    int num = Convert.ToInt32(n/2);
    for (int i = 1 ; i < num; i++)
    

    【讨论】:

    • 这在各个层面上都毫无意义。 ToIn32?它已经是一个int32。除了标签是C,而不是C#。 “优化”掉那个部门?有时是个好主意,但在这种情况下不是。无论如何它不会是一个除法,它很可能会自动移出循环。
    • 这几乎总是由编译器完成。不要打扰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2013-09-16
    • 1970-01-01
    • 2016-04-15
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多