我正在尝试通过计算创建一个素数数组。作为学习编码的项目。最终建立我自己的数学库,这是我学习编写c ++时可以添加到各种级别的东西。 以下代码非常适合根据搜索范围将素数打印到屏幕上,但是我的totalPrimes迭代器被固定在1.所以每次它将最后一个素数放在PrimeNumbers [1]位置。
任何建议都很棒。
#include <iostream>
#include <array>
std::array<long, 10000000> PrimeNumbers={0};
void isPrime(long x);
int main() {
for (long i = 1; i < 10; i++) {
isPrime(i);
}
for(int h = 0; h < 10; h++) {
std::cout << "\nSecond Prime is : " << PrimeNumbers[h];
}
}
void isPrime(long x) {
int count(0), totalPrimes(0);
for (long a = 1; a < x; a++) {
if ((x % a) == 0) {
count += 1;
}
}
if (count == 1) {
++totalPrimes;
std::cout << '\n' << x << " is a Prime number";
PrimeNumbers[totalPrimes] = x;
}
}
答案 0 :(得分:0)
看起来你在变量范围方面遇到了一些麻烦。您的问题的原因(正如我在评论中所述)是totalPrimes
是本地的,因此您每次调用函数时都会创建一个新的整数变量并将其设置为0。
但是,您已将PrimeNumbers
设为全局,并且正在使用isPrime
函数修改它,这看起来不太好。
所有这一切都可以通过一些重组来解决,以使代码更好:
#include <iostream>
#include <array>
bool isPrime(long x);
int main() {
std::array<long, 10000000> PrimeNumbers={0};
int totalPrimes = 0;
for (long i = 1; i < 10; i++) {
if (isPrime(i)) {
std::cout << '\n' << i << " is a Prime number";
PrimeNumbers[totalPrimes++] = i;
}
}
for(int h = 0; h < 10; h++) {
std::cout << h << " Prime is : " << PrimeNumbers[h] << std::endl;
}
}
bool isPrime(long x) {
int count(0);
for (long a = 1; a < x; a++) {
if ((x % a) == 0) {
count += 1;
}
}
return count == 1;
}
答案 1 :(得分:0)
每次运行该函数时,您都会将totalPrimes初始化为0。您需要将totalPrimes作为全局变量,或者更好(因为全局变量可能会出现问题),在您在该函数中执行任何其他操作之前,将其设置为等于PrimeNumbers的第一个可用成员。
答案 2 :(得分:0)
跟踪您的PrimeNumbers阵列的位置。
size_t nLastPos=0;
...
for(size_t x = 0; 1000 > x; ++x)
{
if(isPrime(x))
{
PrimeNumbers[nLastPos++] = x;
}
}
for(size_t i = 0; nLastPos > n; ++n)
{/* print out number PrimeNumbers[n] */ }
答案 3 :(得分:0)
您的程序可以稍微重新组织,以便于跟踪和调试。
不要在isPrime
以外的东西放置逻辑来判断一个数字是否为素数。确保它返回bool
。这将使函数更简单,更容易调试。
使用调用函数中isPrime
的返回值执行其他簿记任务。
您用来检查数字是否为素数的逻辑是不正确的。这需要修复。
这是您发布的代码的更新版本。
#include <iostream>
#include <array>
#include <cmath>
std::array<long, 10000000> PrimeNumbers={0};
bool isPrime(long x);
int main()
{
int totalPrimes = 0;
for (long i = 1; i < 10; i++)
{
if ( isPrime(i) )
{
std::cout << i << " is a Prime number" << std::endl;
PrimeNumbers[totalPrimes] = i;
++totalPrimes;
}
}
}
bool isPrime(long x) {
// 1, 2, and 3 are primes.
if ( x <= 3 )
{
return true;
}
// Even numbers are not primes.
if ( x % 2 == 0 )
{
return false;
}
// Check the rest.
long end = (long)std::sqrt(x);
for (long a = 3; a < end; a += 2) {
if ((x % a) == 0)
{
return false;
}
}
return true;
}
及其输出:
1 is a Prime number
2 is a Prime number
3 is a Prime number
5 is a Prime number
7 is a Prime number
9 is a Prime number
答案 4 :(得分:0)
每个人都在谈论每次调用函数时你的totalPrimes变量是如何重置的,这显然是正确的。你可以从函数返回值并从main递增它,你可以使用在函数外定义变量的全局变量,这样它每次都不会在函数内重置,或者你可以使用
静态变量!
看看这个简单的案例。我有一个名为up_two的函数,每次调用函数时都会将值增加2。静态变量int值具有每次调用函数up_two()时的内存,每次增加值为2。如果我只使用一个整数,它将始终重置该值并使其为零,这是我最初定义的。
使用静态变量的优点是我可以计算函数被调用的次数,并且我可以使我的计数器特定于特定函数。
#include <iostream>
using namespace std;
void up_two();
int main()
{
for(int i = 0; i < 10; i++)
{
up_two();
}
return 0;
}
void up_two()
{
static int value = 0;
cout << value << endl;
value += 2;
}
此程序无法解决您想要解决的特定问题,但如果您弄清楚静态变量的工作原理,它应该可以使您的工作流程更轻松。
这里的神奇之处在于:
static int value = 0;
有了这样,我的程序打印出以下内容:
0
2
4
6
8
10
12
14
16
18
如果没有静态声明,您只需获得10行零 这很麻烦。
希望能帮助您按照自己的方式优化计划。