Форум программистов, компьютерный форум CyberForum.ru

Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
06.11.2011, 09:09     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #1
Никак не приходит в голову, как составить алгоритм, реализующий проверку на то, является ли число простым и является ли совершенным. Если кто не знает/не помнит:

Просто́е число́ — это натуральное число, которое имеет ровно два различных натуральных делителя: единицу и самого себя.
Совершенное число́ — натуральное число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого́ числа).

Буду благодарен за любую помощь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 09:09     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности
Посмотрите здесь:

C++ Найти сумму элементов последовательности, начиная от первого отрицательного элемента и до конца последовательности.
C++ Вывод на экран элементов массивов, которые являются простыми числами
Даны две последовательности.Верно ли, что все числа второй последовательности входят в первую. C++
C++ Используя функции сформировать одномерный массив и отсортировать по возрастанию только те элементы массива, которые являются простыми числами
Программа, вычисляющая среднее арифметическое введённой с клавиатуры последовательности чисел C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cadet
 Аватар для cadet
114 / 75 / 6
Регистрация: 10.01.2010
Сообщений: 275
06.11.2011, 09:23     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #2
для проверки на простоту можно использовать решето эратосфена, можно перебором делителей, мб еще как то)).
по сути есть ветка на форуме -- Простые числа - там и реализации есть - или в гугле решето эратосфена мон ввести будут тоже реализации
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.11.2011, 09:27     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #3
Цитата Сообщение от Glam_Man Посмотреть сообщение
является ли число простым
Решение в лоб - проходить циклом по числам от i = 2 до корень из num. Если num делится нацело на i прерывать цикл, мы получили составное число. Если цикл отработает полностью, то вуаля, мы взяли простое число.
Второй вариант - подготовить "Решето Эратосфена". На википедии все доступно описано касательно него.
Цитата Сообщение от Glam_Man Посмотреть сообщение
является ли совершенным
Ну, если ресурсов не жаль, то опять в лоб, прям как в случае с простым числом. Единственное различие, если число делится нацело, то к некой переменной прибавляем i, затем сравниваем ее с изначальным числом. Опять же статья на википедии в помощь.
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
06.11.2011, 16:03  [ТС]     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #4
Вот, что у меня получилось:
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <locale.h>
const int N=100;
void inMas1(int &n, int a[N])
{
    //Ввод размерности массива
    printf ("Введите размерность массива n=");
    scanf ("%d", &n);
    //Проверка на корректность введённой размерности массива
    if (n<=0)
    {
        printf ("Некорректный ввод \n");
    }
    for (int i=0; i<n; i++)
    {
        //Ввод a[i]
        printf ("a[%d]=", i);
        scanf ("%d", &a[i]);
    }
}
int ProstSoversh (int n, int a[])
{
    bool flagNoSoversh=true;
    bool flagNoProst=true;
    for(int i=0; i<n; i++)
    {
        for(int j=2; j<(n/2); j++)
        {
            if(a[i]%j==0)
            {
                for (int g=0; g<n; g++)
                {
                    if ((a[g]==6)||(a[g]==28)||(a[g]==496)||(a[g]==8128)||(a[g]==33550336)||(a[g]==8589869056)||(a[g]==137438691328))
                    {
                        //Возвращаем 2, флаг, сигнализирующий ,что число не совершенное, опускаем (оно совершенное)
                        flagNoSoversh=false;
                        return 2;
                        break;
                    }
                }
            
            }
            else
            {
                //Возвращаем 1, флаг, сигнализирующий, что число не простое (составное), опускаем (оно простое)
                flagNoProst=false;
                return 1;
                break;
            }
        }
    }
    if (flagNoSoversh&&flagNoProst)
    {
        //Если число не совершенное и не составное - возвращаем 0
        return 0;
    }
}
void outMas(int n, int a[])
{
    //Цикл вывода массива
    for (int k=0; k<n; k++)
    {
        //Во время второй итерации цикла a почему-то меняется на результат, полученный в ProstSoversh и в дальнейшем происходит вывод неверных результатов отработки функции ProstSoversh
        a[k]=ProstSoversh(n, a);
        printf ("%d", a[k]);
    }
}
void main()
{
    setlocale (LC_ALL, "russian");
     //определение переменных
    int n, a[N], b[N];
    //ввод исходных данных
    inMas1(n, a);
    //вывод результата
    if (n>0)
    {
        outMas(n, a);
    }
}
Единственная проблема описана в строке с номером 63. Цитирую: Во время второй итерации цикла a почему-то меняется на результат, полученный в ProstSoversh и в дальнейшем происходит вывод неверных результатов отработки функции ProstSoversh

Убедительная просьба - не писать код заново. Моя просьба заключается лишь в объяснении мне, почему такое происходит и как это исправить
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 16:10     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #5
так ты посмотри что ты туда передаёшь : постоянное n
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
06.11.2011, 16:12  [ТС]     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #6
Нужно передавать ссылку на n?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 16:22     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #7
ну я не знаю, я ваще плохо понял зачем ты передаёшь в функцию массив.
зачем-то этот массив из вне изменяешь.

еще и флаги какие-то которые ничего не делают.

C
1
printf ("%d", ProstSoversh(k, a));
так мб?
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
06.11.2011, 16:28  [ТС]     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #8
Не так. outMas тогда выведет последовательность из нулей длины n

Добавлено через 3 минуты
Функция у меня определяет, является ли элемент массива простым числом (если да - выводится k-тый элемент, равный 1, ибо функция выводит 1) и является ли совершенным числом (если да - выводится k-тый элемент, равный 2, ибо функция выводит 1). Если же не является ни простым ни совершенным, функция возвращает 0 и k-тый элемент выводится равный 0
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 16:28     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #9
значит я не понял задания.
могу только сказать что вы изменяете массив А из вне.


нет я правильно понял задание.
так объясните мне зачем если надо проверить 1 элемент, передавать в функцию весь массив?
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
06.11.2011, 16:41  [ТС]     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #10
Объясню на примере:

Пользователь вводит массив из 10 элементов: 6, 28, 496, 8128, 7, 13, 17, 10, 20, 30. Первый элемент - совершенное число, значит соответствующий элемент выводимого массива равен 2. Второй, третий и четвёртый элемент есть тоже совершенные числа, значит соответствующие элементы выводимого массива тоже равны 2. Пятый, шестой, седьмой элемент есть простые числа, значит соответствующие элементы выводимого массива должны быть равны 1. Ну а последние 3 числа являются ни простыми, ни совершенными, значит, соответствующие элементы выводимого массива должны быть равны 0. В итоге программа должна вывести массив 2222111000

Добавлено через 6 минут
А что тогда нужно передавать в функцию?
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 17:08     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #11
всё теперь понял.
ну передавать в функцию элемент, который мы хотим проверить.
и (если вы так хотите) заменять в исходном массиве числа...
a[k]=ProstSoversh(a[k]); как-то так.

не понимаю вообще как функция работает.

Добавлено через 15 минут
вы уж простите но переписал:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int ProstSoversh (int n)
{
    n = abs(n);
 
    int s=0;
 
    for (int i=1; i<n; i++)
        if (n%i==0) s+=i;
 
    if (s==n) return 2; // сов.
 
 
    for (int i=2; i<n; i++)
        if (n%i==0) return 0; // ни то ни то
 
    return 1; // простое
 
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2011, 19:26     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности
Еще ссылки по теме:

Массив. Найти, сколько членов первой последовательности совпадает с членами второй последовательности C++
C++ Даны две последовательности. Верно ли, что все члены второй последовательности входят в первую?
Построить элементы в убывающей последовательности и вывести первоначальные индексы последовательности C++

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

Или воспользуйтесь поиском по форуму:
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
06.11.2011, 19:26  [ТС]     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности #12
В функцию необходимо передать n, ибо условие выхода из цикла в функции ProstSoversh зависит от n. Если в функцию передавать a[k], то компилятор ругается
Yandex
Объявления
06.11.2011, 19:26     Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности
Ответ Создать тему
Опции темы

Текущее время: 10:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru