价值分配到阵列C

Value assignment into array c++

本文关键字:阵列 分配      更新时间:2023-10-16

我正在尝试创建通过计算完成的质数数组。作为学习编码的项目。最终,要构建自己的数学库,所以当我学会编码C 时,我可以在各种层面上添加。以下是根据搜索范围在屏幕上打印质数的代码,但我的总体迭代器被困在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;
   }
}

您每次运行该功能时都将TotalPrimes初始化为0。您需要将TotalPrimes作为一个全局变量,或者更好(因为全局变量可能会成为问题),将其设置为Primenumbers的第一个可用成员,然后才能在该功能中执行其他任何操作。

跟踪与您的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] */ }

看起来您在可变范围内遇到了一些麻烦。出现问题的原因(正如我在评论中指出的那样)是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. 除了逻辑以外,不要将其放入isPrime中。确保它返回bool。这将使功能更容易调试。

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

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

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

#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

每个人都在谈论每次调用函数时如何重置您的TotalPrimes变量,这显然是正确的。您可以从函数返回值并从main中递增该值,您可以使用在函数之外定义的变量的全局变量,以便每次在函数内部重置它,也可以使用

静态变量!

看这个简单的情况。我有一个称为up_two的函数,每次调用该函数时,都会将值增加两个。静态变量int值具有每次函数up_two()的内存,每次都会增加两个。如果我仅使用一个整数,它将始终重置该值并使其为零,这就是我最初将其定义为的。

使用静态变量的优点是,我可以计算调用函数的次数,并且可以将计数器特定于特定函数。

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

希望可以帮助您按照自己的方式优化程序。