C++ 这个代码段是做什么的?
问题: 给定以下代码段:C++ 这个代码段是做什么的?,c++,algorithm,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; } bool-foo(int-n){ 对于(int i=3;i而言,如果n没有除1、n之外的除数,可能还有2和n/2,则返回true。(编辑:正如评论所指出的,这不太正确。新尝试:如
bool foo(int n) {
for(int i=3;i<sqrt(n)+0.5;i+=2)
{
if((n%i)==0){
return false;
}
}
return true;
}
bool-foo(int-n){
对于(int i=3;i而言,如果n没有除1、n之外的除数,可能还有2和n/2,则返回true。(编辑:正如评论所指出的,这不太正确。新尝试:如果n没有除1之外的小于或等于sqrt(n)的除数,则返回true,可能是2的幂。)
(对我来说,它看起来是要返回质数,但有一个bug:它不认为2是可能的除数。)< /P> < P>它看起来像一个素数校验器,它不处理偶数或一个数,也就是说,假设你已经放弃了偶数和一个。
它返回true的数字是素数,或由两个幂乘以最多一个其他素数组成的非素数。它返回true的非素数是那些没有奇数素数因子或唯一奇数素数因子大于原始数字平方根的数字
请看一个数字列表,其中的n%2&&foo(n)
这是一个需要Trac票证的素数算法。阅读Charles Bailey的答案后,我认为该函数实际上是在检查带有一些约束的素数
检查是假设你已经放弃了1和所有的偶数,而且你必须考虑2是你自己的素数。
< P>程序的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;
#包括
#包括
#定义最大1000
布尔福(国际北){
对于(int i=3;i@nthrgeek:为什么这个函数叫foo?你有没有可能用dis汇编程序得到这个函数,这就是为什么你不知道它的名字?给我们一些上下文,否则我倾向于相信你是逆向工程,你不应该这样做!@jkp:不,这是一个采访问题,希望我们回答这个有趣的问题re:bug,是的,这也是我的印象。一点也不像一个破碎的面试问题。^~我认为问题中没有bug。44出现在最上面的列表中,有一个除数或2,4,11和22,所以它没有1,n,2,n/2那么有选择性。这不是真的。7是28的一个因数,但foo(28)返回true。我的意思是它的错误——如果2个字符被更改[”for(int i=3;我认为这是最好的答案如果我们丢弃1和所有其他偶数,+假设2是第一个数字(不检查),那么只有它才能为剩余的数字给出正确的答案。1不是素数,否则数字就不会有唯一的素数分解。我还没有遇到过任何定义,其中1被视为素数。其中1并不在所有地方:即使在编程竞赛中,如SPOJ或Topcoder等,也假定1不是素数。@Scott Ev恩登:你也可以看看这个:
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;
}