一旦输入复合数字,涉及计数素数的代码就会停止工作。C++。
代码:
#include <iostream>
using namespace std;
int main()
{
int num;
string var;
int sum=0;
int i;
int largest = INT_MIN;
int smallest = INT_MAX;
int j = 0;
int prime = 0;
do {
cout << "Please enter a series of numbers, press (Q or q) to process: ";
cin >> num;
if (cin.fail())
{
cin.clear();
cin >> var;
if (var != "Q" && var != "q")
{
cout << "Invalid input, try again" << endl;
}
else
{
break;
}
}
if (num > largest)
{
largest = num;
}
if (num < smallest)
{
smallest = num;
}
if (num == 0 || num == 1)
{
j == 1;
}
else
{
for (i = 2; i <= num / 2; i++)
{
if (num % i == 0)
{
j = 1;
break;
}
}
if (j == 0)
{
prime++;
}
}
sum += num;
cout << "The corresponding element for the cumulative total sequence is: " << sum << endl;
cin.ignore(sum, '\n');
} while (var != "Q" && var != "q");
cout << endl;
cout << "Largest number: " << largest << endl;
cout << "Smallest number: " << smallest << endl;
cout << "How many prime numbers? " << prime << endl;
cout << "Have a great day!" << endl;
}
程序输出示例:
Please enter a series of numbers, press (Q or q) to process: 2
The corresponding element for the cumulative total sequence is: 2
Please enter a series of numbers, press (Q or q) to process: 7
The corresponding element for the cumulative total sequence is: 9
Please enter a series of numbers, press (Q or q) to process: 4
The corresponding element for the cumulative total sequence is: 13
Please enter a series of numbers, press (Q or q) to process: 13
The corresponding element for the cumulative total sequence is: 26
Please enter a series of numbers, press (Q or q) to process: 17
The corresponding element for the cumulative total sequence is: 43
Please enter a series of numbers, press (Q or q) to process: q
Largest number: 17
Smallest number: 2
How many prime numbers? 2
Have a great day!
前两个输入是素数,工作正常,但是一旦输入一个复合数(4),其余的素数就不会被算作素数。
发布于 2021-09-29 12:58:31
在d-while循环之外设置j = 0
。素数不会改变j
的值,但是复合数会改变。一旦您输入了一个复合数字,并且j
被更改为0
以外的其他东西,这个值就会保持不变,就像您的do-while循环的下一次迭代一样。
解决方案:将int j = 0;
移动到do-while循环中,以便对每个数字进行重置。
通常,您应该尽可能地在作用域的小/局部中声明变量。
因此,当var
、smallest
、largest
和prime
都在do-while循环之外使用时,您的变量num
、sum
、i
和j
仅在do-while循环中使用,因此只应该在循环中声明。
此外,i
仅在for-循环中使用,因此应该仅在其中声明:for (int i = 2; i <= num / 2; i++)
。
而且,与你的问题无关,但我注意到你有:
if (num == 0 || num == 1)
{
j == 1;
}
我想指出的是,j == 1;
的说法是无用的。它检查j
是否为1
,并返回true
或false
,然后不使用。
我想你的意思是:
if (num == 0 || num == 1)
{
j = 1; //assignment, not check
}
https://stackoverflow.com/questions/69383144
复制