这里的目标是创建一个程序,找到并输出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;
}
********************************
*/
Run Code Online (Sandbox Code Playgroud)
从我可以收集的信息来看,我在这里是一条相当正确的道路.我认为我使用双循环和过度使用变量使事情变得复杂,这可能导致程序工作不正确 - 如果需要我可以发布输出,但这肯定是错误的.
我的问题基本上是这样的:我到底出错了什么地方?我不需要有人来重做这个,因为我想自己更正代码,但我已经看了一段时间,并且无法弄清楚为什么我的工作不起作用.此外,由于我对此不熟悉,因此任何有关语法/可读性的输入都会有所帮助.提前致谢.
事实上,如果你的代码可以被2到9中的任何一个数字整除,你的代码会说一个数字是素数.你需要一个bool变量来要求它是全部而不是任何,你还需要改变这个线:
if((val % count_two) == !(check)){
Run Code Online (Sandbox Code Playgroud)
从check=开始true,这解析如下:
if ((val % count_two) == !true){
Run Code Online (Sandbox Code Playgroud)
和
if ((val % count_two) == false){
Run Code Online (Sandbox Code Playgroud)
和
if ((val % count_two) == 0){
Run Code Online (Sandbox Code Playgroud)
(注意该值false是如何转换为的0.有些语言会在这里产生编译错误.C++将其转换为整数).
事实上,这与你想要的相反.相反,写下这个,这是正确和清晰的:
if (val % count_two != 0) {
Run Code Online (Sandbox Code Playgroud)
最后,有一两件事你可以为可读性(和方便!)做的是写i,j和k代替counter,count_two和count_three.这三个字母被程序员普遍认为是循环计数器.
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |