问题:
给出以下代码片段:
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从系列中做了什么。
答案 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票的素数算法。