Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
#1

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

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

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

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

Буду благодарен за любую помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 09:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод последовательности, определяющий, являются ли простыми/совершенными соответствующие элементы введённой последовательности (C++):

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

Сумма положительных чисел из введённой последовательности - C++
Доброго времени суток. Помогите решить задачи, у меня получается с ошибками. Организовать непрерывное введение чисел с клавиатуры, пока...

Построить элементы в убывающей последовательности и вывести первоначальные индексы последовательности - C++
Здравствуйте, уважаемые форумчане!! Помогите разобраться с лабораторной работой Задача -> Построить элементы в убывающей...

Определение числа положительных чисел во введённой с клавиатуры последовательности - C++
Написать программу, которая определяет число положительных чисел во введёной с клавиатуры последовательности (длина последовательности...

Программа, вычисляющая среднее арифметическое введённой с клавиатуры последовательности чисел - C++
Написати програму, яка обчислює середнє арифметичне введеної з клавіатури послідовності чисел. Після вводу останнього числа програма...

Вывод на экран элементов массивов, которые являются простыми числами - C++
Здравствуйте! Пишу сюда в последней надежде на помощь! Нужно сдать две лабы последние, а как их делать, совсем не знай... Пробовал по...

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

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

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

C
1
printf ("%d", ProstSoversh(k, a));
так мб?
0
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
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 16:28 #9
значит я не понял задания.
могу только сказать что вы изменяете массив А из вне.


нет я правильно понял задание.
так объясните мне зачем если надо проверить 1 элемент, передавать в функцию весь массив?
0
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 минут
А что тогда нужно передавать в функцию?
0
OstapBender
584 / 523 / 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; // простое
 
}
0
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
06.11.2011, 19:26  [ТС] #12
В функцию необходимо передать n, ибо условие выхода из цикла в функции ProstSoversh зависит от n. Если в функцию передавать a[k], то компилятор ругается
0
06.11.2011, 19:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2011, 19:26
Привет! Вот еще темы с ответами:

Определить номера строк матрицы, все элементы которых являются простыми числами - C++
Дано: прямоугольная матрица A. Определить номера строк все элементы которых являются простыми числами. Проверку каждой строки на...

Вычислить сумму чисел последовательности, стоящих в позициях, являющихся простыми числами - C++
Добрый день, можете помочь с задачей. Нужно написать программу через функцию. Что то не совсем разобралась... Дана последовательность из...

Используя функции сформировать одномерный массив и отсортировать по возрастанию только те элементы массива, которые являются простыми числами - C++
Помогите закончить две задачи. 1. Используя функции сформировать одномерный массив и отсортировать по возрастанию только те элементы...

Найти члены последовательности, которые являются нечетными - C++
Помогите пожалуйста написать программу: Даны натуральные n, k1, k2, ..., k. Найти те члены k последовательности k1, k2, ..., k, которые...


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

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

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