【问题标题】:Random numbers in the output输出中的随机数
【发布时间】:2021-07-02 07:46:35
【问题描述】:

我已经用 C++ 编码超过一天了,我目前正被这个特殊问题所困扰。我想输入一个整数并生成小于给定整数的每个素数,但输出总是有非素数的随机数。代码如下:

#include <iostream>
#include <math.h>

using namespace std;

int check(int x){
    bool prime = true;
    if (x <= 1){
        prime = false;
        return 0;
    }
    for (int i = 2; i < x; i++){
        if (x % i == 0){
            prime = false;
            return 0;
        }
    }
    if (prime = true){
        return x;
    }
}

int main(){
    int r;
    cout << "Enter range: ";
    cin >> r;
    int primes[r];
    int n = 0;
    for (int i = 0; i < r; i++){
        if (check(i) != 0){
            primes[n] = i;
            n++;            
        }
        else{
        }
    }
    for (int i : primes){
        cout << i << endl;
    }
}

帮我解决这个问题。谢谢。

【问题讨论】:

  • 很高兴您在问题中包含了完整的示例代码,但您能否也包含一个示例输入,以及实际输出和您期望的输出。
  • if (prime = true) 是赋值,而不是比较
  • @dave true,但最后一个块也可以是 return x;,因为此时 prime 始终是 true 并且 prime=true 的计算结果为 true
  • 添加注释:不要使用using namespace std。标准 C++ 不支持 VLA。而且它们在 c 中也有些危险。
  • 从技术上讲,您的程序根本不需要数组primes。只需打印找到的素数即可。

标签: c++ primes


【解决方案1】:

您的代码中的问题是您检查了[0,r] 范围内的数字,并假设在该范围内找到r 素数。那当然不正确。例如,当在[0,r] 范围内有p 素数时,您的输出将打印p 素数,然后是r-p 未初始化的值(这是未定义的行为,您的代码的输出可以是任何东西)。

将最后一个循环改为

for (int i=0; i<n; ++i) {
    cout << primes[i] << endl;
}

仅查看您之前在循环中实际分配了值的 primes 条目。

另外请注意 int primes[r]; 不是标准 C++。见这里:Why aren't variable-length arrays part of the C++ standard?。对动态大小的数组使用std::vector。实际上,在您的代码中,您根本不需要数组。您可以在检查它们的同一循环中简单地打印质数:

if (check(i) != 0) { std::cout << i << "\n"; }

此外,您的check 有点太复杂了。您正在使用不需要的标志。最后一个if 是错误的,因为prime = true 是赋值而不是比较。然而,这并不重要,因为此时prime 总是true(如果不是你已经returned),并且prime=true 确实评估为true。该函数可能如下所示:

int check(int x){
    if (x <= 1){
        return 0;
    }
    for (int i = 2; i < x; i++){
        if (x % i == 0){
            return 0;
        }
    }
    return x;
}

这也将防止编译器发出未从所有分支返回的警告。请注意,您只需要检查因子&lt;= sqrt(x),因为当有一个大于那个的因子时,也一定有一个小于那个的因子。

【讨论】:

  • for (int i : primes) 能否与 VLA 一起正常工作?
  • @S.M.我不知道。除了试图解释它们不需要之外,我不太关心 VLA ;)。似乎他们确实与 std::beginstd::end 合作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多