您好我正在尝试打印从1到4000的所有素数,但我似乎无法弄清楚如何打印8个值然后创建一个新行。我几乎在那里,但由于某种原因,我继续打印8个相同的值,但它确实打印8个数字然后跳到下一行。
我错在哪里打印相同的号码8次?
我认为问题的主要逻辑在于isPrime()
函数。如果有人能帮助我,我会很感激。
bool isPrime(int number);
bool isPerfect(int number);
int main()
{
// Print Prime Numbers
cout << "PRIME NUMBERS: " << endl;
int numberOfPrimes = 0, numberOfPerfects = 0;
for (int i = 2; i < 4000; i++)
{
if(isPrime(i))
{
numberOfPrimes++;
}
}
cout << endl << endl;
cout << "PERFECT NUMBERS: " << endl;
for (int j = 1; j <= 4000; j++)
{
if(isPerfect(j))
{
numberOfPerfects++;
}
}
cout << endl << endl;
cout << "The total number of primes form 1 to 4000 is " << numberOfPrimes << endl << endl;
cout << "The total number of perfects from 1 to 4000 is " << numberOfPerfects << endl << endl;
}
bool isPrime(int number) {
bool numberIsPrime = true;
for (int i = 2; i * i <= number; i++)
{
if (number % i == 0)
{
numberIsPrime = false;
return numberIsPrime;
break;
}
}
if (numberIsPrime)
{
int count = 0;
for (int j = 0; j <= 7; j++)
{
count++;
cout<< setw(6) << number << " ";
if (count % 7 == 0)
{
cout << endl;
}
}
}
return numberIsPrime;
}
bool isPerfect(int number)
{
int i = 1, sum = 0;
bool numberIsPerfect = false;
while( i < number)
{
if (number % i == 0)
{
sum = sum + i;
}
i++;
}
if (sum == number)
{
numberIsPerfect = true;
cout << setw(6) << number << " ";
}
return numberIsPerfect;
}
输出
PRIME NUMBERS:
2 2 2 2 2 2 2
2 3 3 3 3 3 3 3
3 5 5 5 5 5 5 5
5 7 7 7 7 7 7 7
7 11 11 11 11 11 11 11
11 13 13 13 13 13 13 13
13 17 17 17 17 17 17 17
17 19 19 19 19 19 19 19
19 23 23 23 23 23 23 23
23 29 29 29 29 29 29 29
29 31 31 31 31 31 31 31
31 37 37 37 37 37 37 37
37 41 41 41 41 41 41 41
41 43 43 43 43 43 43 43
43 47 47 47 47 47 47 47
47 53 53 53 53 53 53 53
53 59 59 59 59 59 59 59
59 61 61 61 61 61 61 61
61 67 67 67 67 67 67 67
67 71 71 71 71 71 71 71
71 73 73 73 73 73 73 73
73 79 79 79 79 79 79 79
79 83 83 83 83 83 83 83
83 89 89 89 89 89 89 89
89 97 97 97 97 97 97 97
它继续完成正确的素数但重复的值。
答案 0 :(得分:3)
您的代码结构不合理。打印任何东西都不是isPrime()
的工作。 isPrime()
如果参数是素数,则返回true,并且不执行任何其他操作。然后在调用代码中,如果是素数,则应打印数字,计算到目前为止你已在行中打印的素数的数量,并且当它达到8或每行所需的数量时,将该行和零计数归零。
事实上,即使拥有 isPrime()
方法也是不好的做法。通过Eratosthenes的Sieve,在一次通过范围内生成范围内的所有素数,并且然后打印它们,而不是按顺序查询范围中的每个数字,效率要高几个数量级。为了优越感。
答案 1 :(得分:1)
我错在哪里打印相同的号码8次?
在以下for
;你打印8次相同的素数number
for (int j = 0; j <= 7; j++)
{
count++;
cout<< setw(6) << number << " ";
我认为这是静态变量
的工作bool isPrime (int number)
{
static int count { 0 };
for ( int i { 2 } ; i * i <= number ; ++i )
if ( number % i == 0 )
return false;
cout << setw(6) << number << " ";
if ( ++count == 8 )
{
cout << endl;
count = 0;
}
return true;
}
或(恕我直言,好一点)
bool isPrime (int number)
{
static int count { 0 };
bool isP { true };
if ( number == 2 ) // 2 is prime !
;
else if ( 0 == (number & 1) ) // is divisible by 2 ?
isP = false;
else
{
int sq = std::sqrt(number); // calculare square root only one time
// try dividing by odd number only
for ( int i { 3 } ; i <= sq ; i += 2 )
if ( number % i == 0 )
isP = false;
}
if ( isP )
{
std::cout << setw(6) << number << " ";
if ( 0 == (++count & 7) ) // is divisible by 8 ?
std::cout << std::endl;
}
return isP;
}