赋值给数组c ++

时间:2017-12-12 22:34:31

标签: c++ arrays sorting

我正在尝试通过计算创建一个素数数组。作为学习编码的项目。最终建立我自己的数学库,这是我学习编写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;
   }
}

5 个答案:

答案 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)

您的程序可以稍微重新组织,以便于跟踪和调试。

  1. 不要在isPrime以外的东西放置逻辑来判断一个数字是否为素数。确保它返回bool。这将使函数更简单,更容易调试。

  2. 使用调用函数中isPrime的返回值执行其他簿记任务。

  3. 您用来检查数字是否为素数的逻辑是不正确的。这需要修复。

  4. 这是您发布的代码的更新版本。

    #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行零 这很麻烦。

希望能帮助您按照自己的方式优化计划。