价值分配到阵列C
Value assignment into array c++
我正在尝试创建通过计算完成的质数数组。作为学习编码的项目。最终,要构建自己的数学库,所以当我学会编码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;
}
您的程序可以重新结构一些,以使其更容易跟随和调试。
-
除了逻辑以外,不要将其放入
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
每个人都在谈论每次调用函数时如何重置您的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行的零这很麻烦。
希望可以帮助您按照自己的方式优化程序。
- 二维阵列的动态分配
- 为什么删除分配的阵列会导致内存错误?
- 新的阵列分配
- 分配给阵列时出现分段错误?黑客排名 2D 阵列 - DS.
- 分配/访问2d阵列,使得2d子块是连续的
- 重新分配2D阵列并删除旧阵列
- 轻松C++阵列分配
- 英特尔并行工作室 2015 C++中的 2D 动态分配全局阵列
- 为阵列分配空间
- 无效的char阵列分配
- C++ 2D 阵列分配内存以避免分段错误
- C++ 2D 动态阵列分配
- 全局阵列分配 -- 堆栈或堆
- 阵列分配后跟 memcpy 或带储备的向量
- 在 2D 阵列分配期间对 calloc 进行"expression must have (pointer-to) function type"
- 为动态分配的阵列分配更多内存
- C++全局阵列分配
- 阵列分配问题
- 堆阵列分配而不是堆栈上的堆数组分配
- 使用C++new[]为2D阵列分配内存