【问题标题】:Signal 11 in a prime factorization problem素数分解问题中的信号 11
【发布时间】:2021-12-24 04:06:41
【问题描述】:

显然我正在尝试访问尚未分配的内存地址。有人可以告诉我在哪里吗? (对 n 个给定数进行质因式分解的程序)

#include <iostream>

using namespace std;

void sieve(int n){
    int primes[n + 1];
    for(int i = 2; i <= n; i++){
        primes[i] = i;
    }
    for(int i = 2; i <= n; i++){
        if(primes[i] == i){
            for(int j = i*i; j <= n; j += i){
                if(primes[j] == j){
                    primes[j] = i;
                }
            }
        }
    }
    while(n != 1){
        cout << primes[n] << " ";
        n /= primes[n];
    }
    cout << endl;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie();
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        int x;
        cin >> x;
        sieve(x);
    }
}

【问题讨论】:

  • The Sieve 的要点是您生成表一次,然后在其中查找值。为每个数字生成一次会破坏目的。 (另外,变长数组既非标准又容易出错。使用std::vector。)
  • 这听起来是您学习如何使用调试器的绝佳机会。
  • 仅供参考,您应该从 3 开始搜索素数并以 2 递增。数字 2 是唯一的偶素数。您可以“作弊”并创建一个最多 50 个素数的静态数组。:-)
  • 你怎么知道你正在访问一个未初始化的地址?有什么症状?

标签: c++ memory-management


【解决方案1】:

这个循环很可疑:

while(n != 1){
    cout << primes[n] << " ";
    n /= primes[n];
}

你有多确定 n 不会变成 0?而且您还没有将 primes[0] 初始化为任何东西,因此它可以是任何随机值。到那时,n 就变成了谁知道什么,你就在 la-la 的土地上。

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 2016-01-21
    • 2015-08-10
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多