将前n个质数保存在数组中而不覆盖它

时间:2019-05-30 17:46:07

标签: c++ arrays

我正在尝试保存大于或等于输入数字的前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;   
}

1 个答案:

答案 0 :(得分:3)

在您的代码中,将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而不是原始数组。在这种情况下,当向量的大小> = 20时,您只想push_back(index)break