我编写了一个程序,它从用户那里获取10个整数,然后计算其中的素数并显示总和。问题是它将所有奇数作为素数。我已经尝试了很长时间,但无法弄明白。这是程序。
#include<iostream>
#include<conio>
#include<math>
int isPrime(int);
int main()
{
int sum_of_prime;
int count=0;
int a[10];
for(int i=1; i<=10; i++){
cout<<"Enter a number: ";
cin>>a[i];
if( isPrime(a[i]) ){
sum_of_prime+=a[i];
countp++;
}
}
cout<<"Total Prime Numbers in given Numbers: "<<count<<endl;
cout<<"Sum of All the prime numbers in given numbers"<<sum_of_prime<<endl;
getch();
}
int isPrime(int n){
for(int i=2; i<=sqrt(n); i++){
if(n%i==0)
return 0;
else
return 1;
}
}
答案 0 :(得分:6)
您的isPrime
方法会在第一次循环中返回,而 NEVER 会在后续循环中返回。
它检查2,但从不检查3,4,5,6等
在完成整个循环后,您需要return 1;
:
int isPrime(int n)
{
for(int i=2; i<=sqrt(n); i++)
{
if(n%i==0)
return 0; // n has a factor, therefore is not prime, ==> False
}
return 1; // All possible factors were checked, none are factors, therefore prime ==> True
}
P.S。为了提高速度,只需检查2,然后检查3,5,7,9,11等。
检查所有其他偶数(4,6,8等)是没有意义的
如果你只检查奇数,你的运行速度可以快两倍。
您还可以通过循环每次传递sqrt(n)
来提高速度。
此功能如下:
int isPrime(int n)
{
if (n%2 == 0) return 0; // Check 2 separately.
int Root = (int)sqrt(n); // Pre-calculate SQRT once!
for(int i=3; i<=Root; i+=2) // Increment by TWO at a time, getting 3,5,7,9
{
if(n%i==0)
return 0;
}
return 1;
}
答案 1 :(得分:1)
如果isPrime
为假,您的1
函数将返回(i%2==0)
。
请改为尝试:
for(int i=2; i<=sqrt(n); i++)
if(n%i==0)
return 0;
return 1;
答案 2 :(得分:0)
您的isPrime()函数错误。试试这个:
bool IsPrime(int num)
{
if(num == 0)
return true;
num = abs(num);
if(num % 2 == 0) return true;
for(int i = 3; i <= sqrt(num); i+=2)
if(num % i == 0)
return false;
return true;
}