这段代码片段做了什么?

时间:2009-11-22 00:31:45

标签: c++ algorithm

问题:

给出以下代码片段:

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从系列中做了什么。

4 个答案:

答案 0 :(得分:14)

它看起来像一个素数检查器,不处理偶数或一个,即它假设你已经丢弃偶数和一个。

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

查看n % 2 && foo(n)

的数字列表

答案 1 :(得分:4)

如果 n 没有除1, n 之外的除数,并且可能为2且 n / 2 。 (编辑:这不太正确,正如评论指出的那样。新尝试:如果 n 没有小于或等于sqrt的除数,则返回true( n )除了1,也许是2的幂。)

(对我而言,它似乎是为了返回素数,但有一个错误:它不会将2视为可能的除数。)

答案 2 :(得分:4)

在阅读了Charles Bailey的答案之后,我认为该函数实际上是在检查具有一些约束条件的素数。

正在检查prime numbers,假设您已经丢弃了1&amp;所有偶数。你必须考虑自己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 :(得分:2)

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