这个代码片段有啥作用?

Posted

技术标签:

【中文标题】这个代码片段有啥作用?【英文标题】:What does this code-snippet do?这个代码片段有什么作用? 【发布时间】:2009-11-22 00:31:44 【问题描述】:

问题:

给定以下代码sn-p:

bool foo(int n) 
   for(int i=3;i<sqrt(n)+0.5;i+=2)
      
        if((n%i)==0)
          return false;
         
      
   return true;

你能弄清楚函数 foo 的用途是什么吗?

嗯,乍一看,似乎 foo 正在检查素数,但事实并非如此。我编写了一个小测试程序并得到了以下输出:

对于 1 到 100 之间的这些数字,foo 返回 true:

1 2 3 4 5 6 7 8 10 11 13 14 16 17 19 20 22 23 26 28 29 31 32 34 37 38 41 43 44 4 6 47 52 53 58 59 61 62 64 67 68 71 73 74 76 79 82 83 86 88 89 92 94 97

对于 1 到 100 之间的这些数字,foo 返回 false:

9 12 15 18 21 24 25 27 30 33 35 36 39 40 42 45 48 49 50 51 54 55 56 57 60 63 65 66 69 70 72 75 77 78 80 81 84 85 87 90 91 93 95 96 98 99 100

我无法理解 foo 在该系列中正在做什么。

【问题讨论】:

@nthrgeek:为什么这个函数叫 foo?你有没有机会通过反汇编程序获得这个功能,这就是为什么你不知道它的名字?给我们一些背景信息,否则我倾向于相信你在逆向工程你不应该的东西! @jkp: 不是,是面试题,要我们回答这个函数的目的,所以取名foo。 :) 【参考方案1】:

它看起来像一个不处理偶数或一的质数检查器,即它假定您已经丢弃了偶数和一。

它返回 true 的数字是素数,或者是由 2 的幂乘以最多一个其他素数组成的一些非素数。它返回 true 的非素数是那些没有奇素除数或唯一奇素除数大于原始数的平方根的非素数。

查看n % 2 &amp;&amp; foo(n) 对应的号码列表。

【讨论】:

我认为这是最好的答案 好吧,如果我们丢弃 1 和所有其他偶数,+ 假设 2 是第一个数字(不检查),那么它只会对剩余的数字给出正确的答案。 1 不是素数,否则数字不会有唯一的素数分解。 好吧,我还没有遇到任何将 1 视为素数的定义。1 不是在每个地方:en.wikipedia.org/wiki/Prime_number 即使在 SPOJ 或 Topcoder 等编程竞赛中,1 也是假定不是素数。 @Scott Evernden:你也可以看看这个:en.wikipedia.org/wiki/List_of_prime_numbers【参考方案2】:

在阅读 Charles Bailey 的回答后,我认为该函数实际上是在检查带有一些约束的素数。

它正在检查 prime numbers 假设您已经丢弃了 1 和所有偶数。此外,您必须自己考虑 2 是素数。

结论的C++程序:

#include <iostream>
#include <cmath>
#define MAX 1000

bool foo(int n) 
   for(int i=3;i<sqrt(n)+0.5;i+=2)
      
        if((n%i)==0)
          return false;
         
      
    return true;

int isprime(int num) /*Sieve of eratosthenes */

if(num == 1) return false;
bool Primes[MAX+1] = 0;
bool flag;

for(int i=2;i*i<=MAX;i++)
   if(Primes[i] == 0)
     for(int j=2*i;j<=MAX;j+=i)
        Primes[j] = 1;

return !Primes[num];


int main(void)
   int Count = 1;
   std::cout<<2<<" ";
   for(int i=2;i<=MAX;i++)
       if((i % 2) && foo(i))std::cout<<i<<" ";
        Count++;
      
  
  std::cout<<"\nCount :"<<Count<<"\n\n\n";

 Count ^= Count;
 for(int i=1;i<=MAX;i++)
    if(isprime(i) == true)std::cout<<i<<" ";
    Count++;
    

std::cout<<"\nCount :"<<Count<<"\n\n\n";

return 0;

谢谢!

【讨论】:

【参考方案3】:

如果 n 没有除 1、n也许是 2 和 n/2 s>。 (编辑: 这不太正确,正如 cmets 指出的那样。新尝试:如果 n 没有小于或等于 sqrt(n) 不是 1,也可能是 2 的幂。)

(对我来说,它看起来像是要返回素数,但有一个错误:它不将 2 视为可能的除数。)

【讨论】:

re:错误,是的,这也是我的印象。没有什么比一个破碎的面试问题更重要了。 ;^)~ 我认为这个问题没有任何错误。 44 出现在顶部列表中,它有一个除数或 2、4、11 和 22,因此它的选择性不如 1、n、2、n/2。 这不是真的。 7 是 28 的因数,但 foo(28) 返回 true。【参考方案4】:

这是一个需要 Trac 票证的素数算法。

【讨论】:

我的意思是它的错误——如果 2 个字符被更改 ["for(int i=3;i

以上是关于这个代码片段有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

这两个代码片段有啥区别?

有趣的 C++ 代码片段,有啥解释吗? [复制]

java代码在片段活动中不起作用

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

片段 getActivity 不起作用

字符串插值和片段之间有啥显着区别吗?