代码之家  ›  专栏  ›  技术社区  ›  whacko__Cracko

这个代码段是做什么的?

  •  3
  • whacko__Cracko  · 技术社区  · 15 年前

    问题:

    给定以下代码段:

    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 回复  |  直到 15 年前
        1
  •  14
  •   CB Bailey    15 年前

    它看起来像一个质数检查程序,不处理偶数或一个,也就是说,它假定您已经放弃偶数和一个。

    它返回真值的数字是素数,或由两个幂乘最多一个其它素数组成的一些非素数。它返回真值的非素数是那些没有奇数素数除数或唯一奇数素数除数大于原数平方根的素数。

    看一个数字列表 n % 2 && foo(n) .

        2
  •  4
  •   whacko__Cracko    15 年前

    在阅读了查尔斯·贝利的答案之后,我认为这个函数实际上是在检查带有一些约束的素数。

    它正在检查 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
  •  4
  •   Jason Orendorff    15 年前

    如果 n 除了1没有除数, n 大概2岁 N号 2 . ( 编辑: 正如评论指出的那样,这并不完全正确。新尝试:如果 n 没有小于或等于sqrt的除数( n )除了1,也许还有2的幂。)

    (在我看来,它是打算返回素数,但有一个错误:它不认为2是一个可能的除数。)

        4
  •  2
  •   Peter Mortensen user1284631    15 年前

    这是一个质数算法,需要一张trac票。