Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73
1

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

06.11.2011, 09:09. Показов 1492. Ответов 11
Метки нет (Все метки)

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

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

Буду благодарен за любую помощь
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2011, 09:09
Ответы с готовыми решениями:

Вывести в строку только те элементы числовой последовательности, которые являются простыми числами
Вывести в строку, через пробел в прямом порядке только те элементы числовой последовательности,...

Проверить являются ли числа последовательности простыми
через do while:Вводится последовательность из N целых чисел. Каждое число проверить, простое оно...

Вычислить сумму тех членов последовательности, которые являются простыми числами
Дана последовательность натуральных чисел длины n. Вычислить сумму тех из них, которые – простые...

Вычислить сумму чисел последовательности, порядковые номера которых являются простыми числами
Задана последовательность N вещественных чисел. Вычислить сумму чисел, порядковые номера которых...

11
115 / 76 / 6
Регистрация: 10.01.2010
Сообщений: 275
06.11.2011, 09:23 2
для проверки на простоту можно использовать решето эратосфена, можно перебором делителей, мб еще как то)).
по сути есть ветка на форуме -- Вывести все простые числа в заданном интервале - там и реализации есть - или в гугле решето эратосфена мон ввести будут тоже реализации
0
2552 / 1317 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.11.2011, 09:27 3
Цитата Сообщение от Glam_Man Посмотреть сообщение
является ли число простым
Решение в лоб - проходить циклом по числам от i = 2 до корень из num. Если num делится нацело на i прерывать цикл, мы получили составное число. Если цикл отработает полностью, то вуаля, мы взяли простое число.
Второй вариант - подготовить "Решето Эратосфена". На википедии все доступно описано касательно него.
Цитата Сообщение от Glam_Man Посмотреть сообщение
является ли совершенным
Ну, если ресурсов не жаль, то опять в лоб, прям как в случае с простым числом. Единственное различие, если число делится нацело, то к некой переменной прибавляем i, затем сравниваем ее с изначальным числом. Опять же статья на википедии в помощь.
0
6 / 6 / 3
Регистрация: 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

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

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

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

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


нет я правильно понял задание.
так объясните мне зачем если надо проверить 1 элемент, передавать в функцию весь массив?
0
6 / 6 / 3
Регистрация: 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 минут
А что тогда нужно передавать в функцию?
0
592 / 530 / 76
Регистрация: 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; // простое
 
}
0
6 / 6 / 3
Регистрация: 15.10.2011
Сообщений: 73
06.11.2011, 19:26  [ТС] 12
В функцию необходимо передать n, ибо условие выхода из цикла в функции ProstSoversh зависит от n. Если в функцию передавать a[k], то компилятор ругается
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2011, 19:26

Написать предикат, определяющий, являются ли его аргументы взаимно простыми числами - Prolog
Помогите пожалуйста! Надо написать предикат, определяющий, являются ли его аргументы взаимно...

Подсчитать количество отрицательных чисел во введенной последовательности. Конец последовательности-число 0
В документе создайте форму, в которой пользователь введет данные, необходимые для решения задачи,...

Подсчитать количество отрицательных чисел во введенной последовательности. Конец последовательности-число 0
Подсчитать количество отрицательных чисел во введенной последовательности. Конец...

Удалить из вектора все элементы, которые не являются совершенными числами
Помогите пожалуйста с задачей. Буду очень благодарна! С клавиатуры вводятся длина (&lt;=100)...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.