这里的目标是创建一个程序来查找并输出 1 到 100 之间的所有质数。我注意到我倾向于将事情复杂化并创建低效的代码,我很确定我在这里也这样做了。最初的代码是我的,我放在注释标签之间的所有内容都是书中给出的代码作为解决方案。
// Find all prime numbers between 1 and 100
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int counter; // loop counter
int count_two; // counter for second loop
int val; // equals the number of count, used in division to check for primes
bool check;
check = true;
for(counter = 1; counter <= 100; counter++){
val = counter;
for(count_two = 2; count_two <= 9; count_two++){
if((val % count_two) == !(check)){
cout << val << " is a prime number.\n";
}
}
}
return 0;
}
// program didn't work properly because of needless complication; all that needs to be checked for is whether a number is divisible by two
/*
*********correct code***********
#include <iostream>
using namespace std;
int main()
{
int i, j;
bool isprime;
for(i=1; i < 100; i++) {
isprime = true;
// see if the number is evenly divisible
for(j=2; j <= i/2; j++)
// if it is, then it is not prime
if((i%j) == 0) isprime = false;
if(isprime) cout << i << " is prime.\n";
}
return 0;
}
********************************
*/
据我所知,我在这里走的是一条相当正确的道路。我认为我通过双重循环和过度使用变量使事情变得复杂,这可能导致程序工作不正常——如果需要,我可以发布输出,但这肯定是错误的。
我的问题基本上是这样的:我到底哪里出错了?我不需要有人重做这个,因为我想自己更正代码,但我已经看了一段时间,无法弄清楚为什么我的不工作。此外,由于我对此很陌生,因此任何有关语法/可读性的输入也会有所帮助。提前致谢。
最佳答案
事实上,如果一个数字可以被 2 到 9 之间的任何数字整除,你的代码就说它是素数。你需要一个 bool
变量在某处要求它是全部而不是任何,你还需要改变这一行:
if((val % count_two) == !(check)){
由于
check
= true
,其解析如下:if ((val % count_two) == !true){
和
if ((val % count_two) == false){
和
if ((val % count_two) == 0){
(注意值
false
是如何转换为 0
的。有些语言会在此处给出编译错误。C++ 将其转换为整数)。这实际上与您想要的相反。相反,写这个,它是正确和清晰的:
if (val % count_two != 0) {
最后,为了可读性(和方便!)你可以做的一件事是编写
i
、 j
和 k
,而不是 counter
、 count_two
和 count_three
。这三个字母被程序员普遍认为是循环计数器。关于c++ - 学习C++,从一本书中寻找对这个项目的澄清,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16391129/