我正在尝试保存大于或等于输入数字的前20个质数。
现在的输出是997的20倍,因为值会覆盖以前的值。我不知道该怎么做来限制他们。当数组已满时,请停止循环或执行其他操作以免覆盖?

bool is_prime(int num) {
    if (num < 2) {
        return false;
    }

    for (int i = 2; i <= num / 2; i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

void fillArr(int arr[20], int num) {
    for (int index = num; index <= 1000; index++) { //don't know how to set up
    //2nd condition, depends on entered number
        if (is_prime(index)) {
            //save first 20 prime numbers that are >= num into an array
            //Code fills the array with every prime it finds, setting it for all
            //values and overwriting any previous primes it has found. Right now
            //output would be the same 20 prime numbers closest to index 1000,
            //based on second condition
            for (int i = 0; i < 20; i++) {
                arr[i] = index;
            }
        }
    }
    //print test
    for (int i = 0; i < 20; i++) {
        std::cout << arr[i] << "\t";
    }
}

int main() {
        int arr[20];
    int num;

    std::cout << "Enter number: ";
    std::cin >> num;

    fillArr(arr, num);

    return 0;
}

最佳答案

在您的代码中,首先将i初始化为0。每次遇到素数时,将其添加到数组中并增加i。在i >= 20时中断。

void fillArr(int arr[20], int num) {
    int i = 0;
    for (int index = num; index <= 1000 && i < 20; index++) {
        if (is_prime(index)) {
            arr[i++] = index;
        }
    }
    //print test
    for (int i = 0; i < 20; i++) {
        std::cout << arr[i] << "\t";
    }
}

还要注意,这不是找到质数的最佳方法。为了找到给定的数字是否为质数,您只需要检查该数是否可以被质数除以该数字的平方根(而不是直到n/2)。您可能还想阅读有关Seive of Eratosthenes的信息。

正如注释中所指定的,最好使用std::vectorstd::array而不是原始数组。在这种情况下,当 vector 的大小> = 20时,您只想push_back(index)break

关于c++ - 将前n个质数保存在数组中而不会覆盖它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56383171/

10-11 17:05