0 / 0 / 0
Регистрация: 19.03.2020
Сообщений: 26
1

Функция отбирающая в массив из исходного только простые числа

21.03.2020, 04:01. Показов 857. Ответов 14

Проблема в том, что данный алгоритм из заполненного массива заполняет другой массив простыми числами, но на месте нулей оказывается "мусор из памяти".. Совсем не понимаю как от него избавиться.. Очень много времени уже на это убил.
Вот код функции :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void prime_num(int mas[], int N, int res[])
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 2; j <= mas[i] / 2; j++)
        {
            if (mas[i] % j == 0 && mas[i] != j)
            {
                mas[i] = 0;
                break;
            }
        }
            if (mas[i] != 0)
                res[i] = mas[i];
            
    }
    cout << endl;
}
P.S. с решетом эратосфена не задалось, пробовал искать макс элемент массива, но по итогу все тот же мусор получался.

Добавлено через 9 минут
Важно использование именно статики!!!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2020, 04:01
Ответы с готовыми решениями:

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

Сформировать массив, в который числа из исходного входят только по одному разу
Заполнить массив А, состоящий из 10 элементов, повторяющимися числами. Сформировать из него массив...

Создать новый массив, поместив туда только нечётные числа из исходного массива
2) Дан массив из M чисел. Создать новый массив, поместив туда только нечётные числа из исходного...

Получить другой массив, состоящий только из чисел исходного массива, меньших данного числа N
Составьте паскаль-программу для решения следующий задачи: «Дан одномерный массив действительного...

14
7416 / 5011 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
21.03.2020, 04:10 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
bool is_prime(int n)
{
    if (n==2) return true;  
    if (n < 2 || n%2==0) return false;  
    for (int i=3; i*i<=n; i+=2)
    if (n%i==0) return false;
    return true;  
}
 
void Print (int *x, int N)
{
    for (int i = 0; i < N; i++)             
        cout << x[i] << " ";        
    cout << "\n";    
} 
 
int main()
{
    srand((int)time(0));
    int n, m=0, p=0;
    cout << "n="; cin >> n;
 
    int *a = new int[n];
 
    cout << "Enter " << n << " integer numbers:\n";
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        if (is_prime(a[i])) m++;        
    } 
    
    if(m)
    {
    int *b = new int[m];
    
    for (int i = 0; i < n; i++)        
        if (is_prime(a[i])) b[p++]=a[i];
        
    Print(b,m);  
    delete[]b;
    }    
    else cout << "Prime numbers are absent\n";   
    
    delete[]a;    
system("pause");
return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от molodoy_boy Посмотреть сообщение
Важно использование именно статики!!!
на статику переделайте сами. учитывая что количество простых чисел заранее неизвестно, при применении статических массивов справа от простых будут находиться нули.
0
1368 / 591 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
21.03.2020, 04:26 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <string>
#include <iostream>
#include <cmath>
 
using namespace std;
 
 
bool prime(const int n){
    if (n<2) return false;
 
    for(long long i=2;i<=sqrt(n);i++)
        if(n%i==0 || n<2 )
            return false;
    return true;
}
 
void print(int arr[], const int MAX){
    for (int i=0; i<MAX; i++) cout << arr[i] << ' ';
}
 
int main(){
    const int MAX = 50;
    int arr[MAX] = {};
    int arr_prime[MAX] = {};
 
    int count_prime;        //счётчик простых чисел
    for (int i=0; i<MAX; i++) arr[i] = i;
    print(arr, MAX);
 
 
    for (int i=0; i<MAX; i++){      //идёшь по основному массиву и проверяешь каждое значение на простоту, если простое, то записываешь в массив простых чисел и наращиваешь счётчик простых чисел
        if (prime(arr[i])) arr_prime[count_prime++] = arr[i];
    }
 
    cout << "\nresult: \n";     //Обходишь не весь массив, а только часть, согласно счётчику простых чисел.
    for (int i=0; i<count_prime; i++) cout << arr_prime[i] << ' ';
 
}
0
0 / 0 / 0
Регистрация: 19.03.2020
Сообщений: 26
21.03.2020, 15:28  [ТС] 4
Проблема та же, если выводить отдельно чисто результирующий массив с простыми числами, в нем остается мусор..

Добавлено через 4 минуты
Спасибо за ответ, но требуется избавиться от нулей.. По сути если массив на 5 элементов : 1 2 3 4 5, мы должны вывести res массив на 3 элемента : 2 3 5.. Не просто поставить вывод простых чисел в функцию, а собрать новый массив именно из простых чисел. Варварство конечно, но задача именно такая
0
7416 / 5011 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
21.03.2020, 15:31 5
molodoy_boy, размер статического массива должен быть известен на этапе компиляции, то есть во время выполнения программы Вы не сможете создать статический массив нужного Вам размера. такая задача решается через динамический массив, ещё лучше через вектор. если Вам нужен именно статический массив - варианта два: или выводить массив с нулями или выводить массив на экран частично (без нулей).
1
0 / 0 / 0
Регистрация: 19.03.2020
Сообщений: 26
21.03.2020, 15:52  [ТС] 6
Я справился, всем спасибо за ответ, в итоге просто в конце всех операций присвоил количеству элементов = кол-во простых%кол-во элементов (N = count_prime%N)
Вроде все работает
0
7416 / 5011 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
21.03.2020, 16:04 7
Цитата Сообщение от molodoy_boy Посмотреть сообщение
присвоил количеству элементов = кол-во простых%кол-во элементов
это Вы явно что-то не то делаете. показывайте код.
0
0 / 0 / 0
Регистрация: 19.03.2020
Сообщений: 26
21.03.2020, 16:38  [ТС] 8
Спасибо, но заранее, я понимаю что это очень некорректно написанный код, что лучше было объявить сначала N, потом задавать массив и т.д., но такие требования)))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<iostream>
#include<cmath>
using namespace std;
void in_arr(int mas[], int N);
void prime_num(int mas[], int &N, int res[]);
void out_arr(int res[], int N);
int analysis(int a) 
{
    if (a < 2) 
        return 0;
    for (int i = 2; i <= sqrt(a); i++)
        if (a % i == 0 || a < 2)
            return 0;
    return 1;
}
void main()
{
    setlocale(LC_ALL, "ru");
    int mas[10], res[10], N;
    cout << "Введите длину массива.. " << endl;
    cin >> N;
    in_arr(mas, N);
    prime_num(mas, N, res);
    out_arr(res, N);
    system("pause");
}
void in_arr(int mas[], int N)
{
    cout << "Введите элементы массива.. " << endl;
    for (int i = 0; i < N; i++)
        cin >> mas[i];
}
 
void prime_num(int mas[], int &N, int res[])
{
    int count_prime = 0; 
    for (int i = 0; i < N; i++) 
    {    
        if (analysis(mas[i]))
            res[count_prime++] = mas[i];
    }
    if (count_prime != N)
    {
        N = count_prime % N;
    }
}
void out_arr(int res[], int N)
{
    cout << "Массив простых чисел : " << endl;
    for (int i = 0; i < N; i++)
        cout << res[i] << " ";
    cout << endl;
}
Также все написано в отдельных функциях по заданию.

Добавлено через 26 минут
Цитата Сообщение от Yetty Посмотреть сообщение
это Вы явно что-то не то делаете. показывайте код.
С динамикой все было бы куда проще и правильнее, но нужно сделать так :c
0
7416 / 5011 / 2890
Регистрация: 18.12.2017
Сообщений: 15,694
21.03.2020, 17:12 9
Цитата Сообщение от molodoy_boy Посмотреть сообщение
я понимаю что это очень некорректно написанный код
то что понимаете это уже неплохо если заранее берёте заведомо больший массив, чем нужно, хотя бы размер сделайте побольше. смысла брать остаток не вижу, можно просто:
C++
1
N = count_prime;
при работе с целыми при возможности лучше не подключать #include<cmath> и не пользоваться её функциями, в частности sqrt, тип для функции так и просится bool - впрочем всё это Вам уже показывал.
строку 16 так:
C++
1
int main()
в конце этой функции
C++
1
return 0;
0
0 / 0 / 0
Регистрация: 19.03.2020
Сообщений: 26
21.03.2020, 17:18  [ТС] 10
Цитата Сообщение от Yetty Посмотреть сообщение
то что понимаете это уже неплохо если заранее берёте заведомо больший массив, чем нужно, хотя бы размер сделайте побольше. смысла брать остаток не вижу, можно просто:
C++
1
N = count_prime;
при работе с целыми при возможности лучше не подключать #include<cmath> и не пользоваться её функциями, в частности sqrt, тип для функции так и просится bool - впрочем всё это Вам уже показывал.
строку 16 так:
C++
1
int main()
в конце этой функции
C++
1
return 0;
И вправду))) N = count_prime...
Буду прогрессировать и учиться на ошибках, большое спасибо за всё!
0
1368 / 591 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
21.03.2020, 18:37 11
Цитата Сообщение от molodoy_boy Посмотреть сообщение
собрать новый массив
Цитата Сообщение от molodoy_boy Посмотреть сообщение
использование именно статики!!!
Невозможно.
0
С чаем беда...
Эксперт CЭксперт С++
10014 / 5360 / 1467
Регистрация: 18.10.2014
Сообщений: 12,926
21.03.2020, 18:38 12
Цитата Сообщение от molodoy_boy Посмотреть сообщение
Важно использование именно статики!!!
Что такое "статика"?
0
0 / 0 / 0
Регистрация: 19.03.2020
Сообщений: 26
21.03.2020, 18:42  [ТС] 13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что такое "статика"?
Ну статические массивы я имел ввиду
0
1368 / 591 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
21.03.2020, 18:46 14
Чтобы был не мусор, надо делать так:
C++
1
int mas[10] = {}, res[10] = {}
Будут в хвосте нули.

Если массив res используется многократно, надо написать функцию обнуления и обнулять его каждый раз перед повторным использованием.

Другой вопрос, зачем туда лезть, где неактивная зона массива, ну да ладно.
0
0 / 0 / 0
Регистрация: 19.03.2020
Сообщений: 26
21.03.2020, 22:40  [ТС] 15
Цитата Сообщение от daslex Посмотреть сообщение
Чтобы был не мусор, надо делать так:
C++
1
int mas[10] = {}, res[10] = {}
Будут в хвосте нули.

Если массив res используется многократно, надо написать функцию обнуления и обнулять его каждый раз перед повторным использованием.

Другой вопрос, зачем туда лезть, где неактивная зона массива, ну да ладно.
Да, я просто обрезал часть с нулями, к кол - ву элементов массива присвоил значение кол-ва нужных чисел, по сути он просто не выводит нули. Вроде этого более чем достаточно) В динамике можно сделать все по человечески
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2020, 22:40
Помогаю со студенческими работами здесь

В массив B включить только четные элементы исходного массива, а в массив C - только нечетные
Задан массив A Из его элементов сформировать два массива:B и C. В массив B включить только...

Простые числа исходного одномерного массива
Поменять местами максимальный и минимальный элементы среди простых чисел исходного одномерного...

Записать в массив X только положительные элементы исходного, а в Y только отрицательные
В общем мне нужно ввести массив R, состоящий из 17 элементов:положительных и отрицательных. Массив...

Для каждого числа последовательности вывести новое число, состоящее только из четных чисел исходного числа
жду помощи!!!С++ водится последовательность из N целых чисел.Для каждого числа последовательности...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru