我在这个程序上工作,确定一个数字是否为素数。编译时我没有收到任何错误,但输出不正确。任何人都可以告诉我什么是错的(以及如何解决它?)?
#define PROMPT "Please enter a whole number: "
#define NOT_PRIME "The number is not a prime number! "
#define PRIME "The number is a prime number "
#define DONE 0
#define FIRST_FACTOR 3
using std::cout;
using std::cin;
int main(){
int i;
char number;
cout << PROMPT;
cin >> number;
for (i=FIRST_FACTOR; i<=number; i++){
prime = true;
for (int n=2; n<=i-1; n++){
if (i%n == 0){
prime = false;
}
}
if(prime){
cout << number << PRIME << endl;
}
else{
cout << number << NOT_PRIME << endl;
}
}
return 0;
}
答案 0 :(得分:3)
最大的问题是,如果您的计划应该打印number
,则会始终打印i
。
if(prime){
cout << i << PRIME << endl;
}
else{
cout << i << NOT_PRIME << endl;
}
另一个问题是您将number
声明为char
而不是int
。
除此之外,您的程序正在运行(link to ideone),但次优。
为了使其达到最佳,请考虑这些变化(按挑战增加的顺序):
i+1
不是素数,并将i
增加2。n<=i-1
循环中的for
写n*n <= i
2
到sqrt(i)
的所有可能因素,只测试您已找到的素数。答案 1 :(得分:1)
您的问题是:
以下是我认为解决方案应该是这样的:
#include <iostream>
int main() {
std::cout << "Please enter a whole number: " << std::endl;
unsigned int number;
std::cin >> number;
for (unsigned int i = 2; i * i < number; i++) {
if(number%i == 0) {
std::cout << "The number is not a prime number! " << std::endl;
return 0;
}
}
std::cout << "The number is a prime number " << std::endl;
return 0;
}
答案 2 :(得分:0)
我不确定你为什么要在代码中循环两次,你可以将它改成类似
的东西if (number % 2 == 0) prime = false;
for (i = 3; i <= sqrt(number) && prime; i+=2)
if (number % i == 0) prime = false;
意识到一个数字的最高除数(可以均匀分配)等于它的平方根,所以你不需要检查更多。
答案 3 :(得分:0)
我假设您应该循环两次以继续询问新条目,直到它们输入0。
#define PROMPT "Please enter a whole number: "
#define NOT_PRIME " is not a prime number! "
#define PRIME " is a prime number "
using std::cout;
using std::cin;
int main(){
int number;
bool prime;
while (true)
{
prime = false;
cout << PROMPT;
cin >> number;
if (number == 0) break;
int MaxPossibleFactor = (int)(sqrt(number) + 1);
if ((number % 2) == 0)
{
prime = true;
}
else
{
for (int i=3; i<=MaxPossibleFactor; i += 2)
{
if ((number % i) == 0)
{
prime = true;
break;
}
}
}
if (prime)
{
cout << number << PRIME << endl;
}
else
{
cout << number << NOT_PRIME << endl;
}
}
return 0;
}