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

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

Войти
Регистрация
Восстановить пароль
 
 
Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 378
#1

Поиск совершенного числа в массиве - C++

07.12.2013, 04:24. Просмотров 1183. Ответов 21
Метки нет (Все метки)

Необходимо найти в массиве все совершенные числа в диапазоне от n1 до n2. Будем учитывать, что массив уже заполнен.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    //задаём диапазон исследуемых элементов
    cout<<"Введите n1 = ";
    cin>>n1;
    cout<<"Введите n2 = ";
    cin>>n2;
 
    //находим совершенные числа
    int x;
    for(i = mas[n1]; i <= mas[n2]; n1++){
        x = i;
        for(j = 1; j < x; j++){
            if(x % j == 0)
                p+=j;
        }
        if(p == i)
            cout<< "Число " << i << " совершенное\n";
        p = 0;
    }
Программа работает неверно. Подскажите, в чём моя ошибка..?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2013, 04:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск совершенного числа в массиве (C++):

Поиск совершенного числа N через цикл for - C++
Сложить программу с помощью цикла for Задание Дано некоторое число N. Сложить программу поиска “совершенных” чисел меньших за N....

Определение совершенного числа - C++
Напишите программу, определяющую, является ли введенное пользователем натуральное число совершенным, то есть равно ли оно сумме своих...

Поиск числа в двумерном массиве (бинарный поиск) - C++
Произвожу поиск элемента в массиве двумя способами: линейным(последовательным) поиском и бинарным(двоичным). Первый работает на ура. Второй...

Найти среднее арифметическое элементов массива расположенных после последнего совершенного числа - C++
Помогите пожалуйста составить программу. Из положительных значений двух целочисленных массивов различной размерности сформировать общий...

Поиск числа в массиве - C++
Здравствуйте, тут в общем такое дело. Не могу написать программу, которая находит в массиве введенное число. Вот она: ...

Бинарный поиск числа в массиве - C++
Здравствуйте имеется программка в которую через клаву вводишь определенное кол-во чисел(кол-во элементов нужно выбрать самому), она...

21
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 05:35 #2
C++
1
i <= n2
так как mas[n2] - конкретное число, а не номер числа в массиве (если я понятно изъясняюсь).
1
Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 378
07.12.2013, 16:34  [ТС] #3
katsidelin, как раз таки нет. Мы задаём диапазон исследуемых значений в массиве - от n1-го элемента до n2-го
0
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 16:51 #4
Прошу прощения, я ответил, не проверив код.
Пока ничего хорошего не получается у меня.
В википедии почитал, что такое совершенное число.
Принцип в складывании натуральных множетлей понял, а при реализации
у меня то вылет за пределы массива, то ошибки при очистки памяти...
1
Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 378
07.12.2013, 17:00  [ТС] #5
katsidelin, Совершенными называются числа, равные сумме своих делите-
лей, без самого числа. Например, совершенным является число
28 = 1 + 2 + 4 + 7 + 14; 6 = 1 + 2 + 3.
0
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 17:45 #6
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
// [url]http://www.cyberforum.ru/cpp-beginners/thread1031605.html[/url]
// [url]http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE[/url]
 
#include <iostream>
 
 
using namespace std;
 
int main(void)
{
    /* +++++++++++++++++++++++++++++++ */ // Телепаты гадают что тут.
 
    const long int mas[17] = {1, 6, 40, 496, 1000, 8128, 8200, 9000, 33550336, 33550337, 8589869056, 8789869056, \
                              137438691328, 2305843008139952128, 2305843008139952129}; // 16 элементов для начала. 0-15.
//    long int **dividends = new long int*; // Массив делителей.
    long int szCountDividends = 0; // Счётчик числа делителей в массиве.
    long int szSumDividends = 0; // Сумма всех делителей.
 
    /* +++++++++++++++++++++++++++++++ */
    int n1 = 0, n2 = 0;
    do
    {
        //задаём диапазон исследуемых элементов
        cout<<"Введите n1 = ";
        cin>>n1;
        if ( n1 >= 0 && n1 <= 15 )
        {
            cout<<"Введите n2 = ";
            cin>>n2;
 
            if ( n2 < 0 || n2 > 15 )
            {
                 cerr << "n2 вышло за пределы массива! Пробуем занова!" << endl;
            };
        }
        else
        {
            cerr << "n1 вышло за пределы массива! Пробуем занова!" << endl;
        };
        if (n1>n2) cerr <<"n1 должно быть меньше n2!"<<endl;
    } while ( n1 < 0 || n1 > 15 || n2 < 0 || n2 > 15 || n1 > n2 );
 
    //находим совершенные числа
 
 
 
 
        long int x,i,j,p;
        for(i = mas[n1]; i <= mas[n2]; n1++){
            x = i;
            for(j = 1; j < x; j++){
                if(x % j == 0)
                    p+=j;
            }
            if(p == i)
                cout<< "Число " << i << " совершенное\n";
            p = 0;i++;
        }
 
 
 
    return 0;
}
 
/*
 * Совершенное числоМЃ (др.-греч. бјЂПЃО№ОёОјбЅёП‚ П„О*О»ОµО№ОїП‚) — натуральное число, равное сумме всех своих собственных делителей
 * (т. е. всех положительных делителей, отличных от самогоМЃ числа). По мере того как натуральные числа возрастают,
 *  совершенные числа встречаются всё реже.
 *
 * Совершенные числа образуют последовательность:
 *
 *   6, 28, 496, 8128, 33550336, 8589869056, 137438691328,
 *   2305843008139952128, 2658455991569831744654692615953842176,
 *   191561942608236107294793378084303638130997321548169216, … (последовательность A000396 в OEIS).
 */
Уже кое-что, но конца и края нет вычислениям.
Попробуй поправить мой код. Кстати, ты забыл прирастить i в массиве -
C++
1
i++;


Добавлено через 1 минуту
Bash
1
2
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                   
 5917 user      20   0   12508   1020    868 R 95,6  0,0   2:34.25 p2
Программа явно не может остановиться и кушает системные ресурсы.
Пока теряюсь в догадках...

Добавлено через 9 минут
PureBasic
1
2
3
$ ./p2
Введите n1 = 7
Введите n2 = 8
Понял.
Программа работает верно.
Просто совершенные числа на столько редкие, что мощности моего процессора amd athlon 3200 не хватает для быстрого поиска.
1
Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
07.12.2013, 17:56 #7
Цитата Сообщение от Кротяка Посмотреть сообщение
for(i = mas[n1]; i <= mas[n2]; n1++)
Не думаю, что программа работает правильно. Первый раз i была проинициализирована i = mas[n1]. Обновляется только индекс массива n1++. Значение переменной i же как было, так и остается равным mas[n1].
Соответственно условие i <= mas[n2] если было истинно на первой итерации, так и остается истинным на всех последующих. Плюс еще вложенный цикл пробегается на каждой итерации внешнего цикла полностью.
Неудивительно, что загрузка ЦП 95.6%
0
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 18:02 #8
А как же строка p = 0;i++;
?

Добавлено через 2 минуты
Цитата Сообщение от Extrim88 Посмотреть сообщение
Плюс еще вложенный цикл пробегается на каждой итерации внешнего цикла полностью.
Неудивительно, что загрузка ЦП 95.6%
А вот тут я прошу подробнее!
1
Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
07.12.2013, 18:04 #9
А где
Цитата Сообщение от katsidelin Посмотреть сообщение
А как же строка p = 0;i++;
?
А где в коде ТС вообще обновление переменной i, кроме как начальная инициализация ее во внешнем цикле for
0
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 18:05 #10
Bash
1
2
3
4
5
6
7
$ ./p2
Введите n1 = 0
Введите n2 = 7
Число 6 совершенное
Число 28 совершенное
Число 496 совершенное
Число 8128 совершенное
Где повторение?
1
Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
07.12.2013, 18:10 #11
katsidelin, я про исходный код ТС говорю
Цитата Сообщение от Кротяка Посмотреть сообщение
//задаём диапазон исследуемых элементов
* * cout<<"Введите n1 = ";
* * cin>>n1;
* * cout<<"Введите n2 = ";
* * cin>>n2;
//находим совершенные числа
* * int x;
* * for(i = mas[n1]; i <= mas[n2]; n1++){
* * * * x = i;
* * * * for(j = 1; j < x; j++){
* * * * * * if(x % j == 0)
* * * * * * * * p+=j;
* * * * }
* * * * if(p == i)
* * * * * * cout<< "Число " << i << " совершенное\n";
* * * * p = 0;
* * }
а не про ваш. Разбираем же, кажется, где ошибка в коде у ТС. Все, что я писал ранее, относится к этому куску кода.
0
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 18:14 #12
C++
1
j = 1;
Если тут поставить вместо единицы i, то потеряются делители...
Натыкайте меня носом, увы не понимаю ????

Добавлено через 1 минуту
Цитата Сообщение от Extrim88 Посмотреть сообщение
а не про ваш. Разбираем же, кажется, где ошибка в коде у ТС. Все, что я писал ранее, относится к этому куску кода.
Ну, я не сразу понял что есть ТС.
А свой код я лишь основал на его коде.

Добавлено через 54 секунды
А!
Топик Стартер! ПОНЯЛ
1
Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 378
07.12.2013, 19:17  [ТС] #13
Extrim88, хорошо. Как по вашему должен выглядеть цикл?

Добавлено через 2 минуты
katsidelin, вложенный цикл ищет натуральные делители числа. Начиная с единицы и заканчивая самим числом
0
katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 19:29 #14
Цитата Сообщение от Кротяка Посмотреть сообщение
katsidelin, вложенный цикл ищет натуральные делители числа. Начиная с единицы и заканчивая самим числом
Я не решил задачу?
1
Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 378
07.12.2013, 20:10  [ТС] #15
katsidelin, решили, спасибо.

Добавлено через 9 минут
katsidelin, не могли бы вы подсказать, как теперь вывести на экран сообщение о том, что совершенных чисел не найдено? Ну т.е. если этих чисел нет в исследуемом диапазоне, то должно выводится это сообщение
0
07.12.2013, 20:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 20:10
Привет! Вот еще темы с ответами:

Поиск числа в символьном массиве - C++
Вводим строку символов, где есть и числа, и буквы, далее из этой строки нужно найти максимальное число. Для меня сложность в том как из...

Поиск заданого числа в массиве - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;conio.h&gt; using namespace std; int main(int argc, char** argv) { int n,b; ...

Бинарный поиск числа в массиве - C++
Дан упорядоченный массив чисел от 0 до 100. Необходимо выполнить бинарный поиск числа 25. Как его реализовать? Я знаю, что в теории должно...

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


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

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

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