Есть ли способ передать вектор из вспомогательной функции в другую вспомогательную функцию в C ++? - PullRequest
0 голосов
/ 27 февраля 2019

Я работаю над одним из классических упражнений C ++ по написанию программы, чтобы определить, какие числа являются простыми числами.Версия, над которой я сейчас работаю, требует, чтобы я мог определить, какие значения являются простыми до значения, введенного пользователем, которое называется max.

Алгоритм, который я пытаюсь построить, работает следующим образом:

1) Введите желаемое значение max.

2) Возьмите это max изатем поместите его в функцию, которая вычислит sqrt(max).

3) Используя sqrt(max), я построю вектор простых чисел до значения sqrt(max)

4)используя этот вектор sqrt(max), я затем оценю, какие значения являются простыми, до значения max, создав специальную функцию для определения того, какие значения в списке до max являются простыми.Затем я сгенерирую список всех этих простых чисел.

С этой структурой здесь мой код для попытки:

#include "pch.h"
#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::string;
using std::vector;

int determine_prime(int x) {
    // function made to determine if a number is prime
    // used the fact that to determine if number is prime only need to check if
    // prime values less than sqrt(x) divide x

    vector<int> vector_of_sqrt_primes = list_of_prime_sqrt();

    vp_1 = x % vp_1 = x % vector_of_sqrt_primes[i];

    for (int i = 0; i < vector_of_sqrt_primes.size(); i = i + 1) {
        if (vp_1 == 0 &&
            x != vector_of_sqrt_primes[i]) { // verifying if value is prime
            cout << x << " is not a prime number. \n";
            return 0;
        }

        else {
            cout << x << " is a prime number. \n";
            return 1;
        }
    }
}

int list_of_prime_sqrt(int y) {
    // using this vector as reference for all values less than the sqrt of max

    vector<int> vector_of_primes_sqrt = {2};
    int vps = 0;

    for (int i = 2; i < round(sqrt(y)); i = i + 1) {
        for (int j = 0; j < vector_of_primes_sqrt.size(); j = j + 1) {
            vps = i % vector_of_primes_sqrt[j];

            if (vps == 0 && i != vector_of_primes_sqrt[j]) {
                cout << i << " is not a prime number. \n";
            } else {
                cout << i << " is a prime number. \n";
                vector_of_primes_sqrt.push_back(i);
            }
        }
    }
}

int main() {
    int max = 0;
    vector<int> primes_list = {};

    cout << "Please enter the number of integers you would like to inspect "
            "whether they are prime.\n";
    cin >> max;

    list_of_prime_sqrt(max);

    for (int i = 1; i < max + 1; i = i + 1) {
        int p = determine_prime(i);

        if (p == 1) {
            primes_list.push_back(i);
        }
    }

    for (int j = 0; j < primes_list.size(); j = j + 1) {
        cout << primes_list[j] << "\n";
    }
}

Итак, я надеялся, что смогуиспользовать vector_of_sqrt_primes в функции determine_prime(), а затем определить, какие значения являются простыми числами, и вернуть их в main().Но я бью стену.Итак, все это, чтобы спросить, есть ли для меня способ сделать это?Я не дошел до того, чтобы иметь возможность использовать указатели или что-то продвинутое.Я работаю над принципами и практикой программирования в Stroustroup, и это глава 4.

1 Ответ

0 голосов
/ 27 февраля 2019

Ниже приведены два разных способа решения вашей проблемы.Один возвращает вектор, а другой использует передачу по ссылке, чтобы иметь возможность изменять вектор, переданный в параметр

#include <iostream>
#include <vector>
#include <string>

bool is_prime(int number){

    //exceptions
    if(number == 1) return false;
    if(number == 2 || number == 5) return true;

    std::string str = std::to_string(number);
    if(str.back() == '1' || str.back() == '3' || str.back() == '7' ||  str.back() == '9'){
        for(int i = 3; i * i <= number; i++){
            if(number % i == 0){
                return false;
            } 
        }
        return true;
    }
    return false;
}

//adds the value to the vector passed in and the values will 'save'
void find_primes(std::vector<int>& primes, int max){

    for(int i = 0; i < max; i++){
        if(is_prime(i)) primes.push_back(i);
    }
}

//adds the results to a vector and returns that vector
std::vector<int> return_vec_primes(int max){

    std::vector<int> results;
    for(int i = 0; i < max; i++){
        if(is_prime(i)) results.push_back(i);
    }

    return results;
}

int main(){

    std::vector<int> reference_vec;

    //pass the vector into the function
    find_primes(reference_vec, 100);

    //the function will return the vector into 'returned_vec'
    std::vector<int> returned_vec = return_vec_primes(100);

    //same results
    for(int i : reference_vec) std::cout << "prime: " << i << "\n";
    for(int i : returned_vec) std::cout << "prime: " << i << "\n";

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...