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

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

Восстановить пароль Регистрация
 
 
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
07.12.2013, 04:24     Поиск совершенного числа в массиве #1
Необходимо найти в массиве все совершенные числа в диапазоне от 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;
    }
Программа работает неверно. Подскажите, в чём моя ошибка..?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
katsidelin
 Аватар для katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 05:35     Поиск совершенного числа в массиве #2
C++
1
i <= n2
так как mas[n2] - конкретное число, а не номер числа в массиве (если я понятно изъясняюсь).
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
07.12.2013, 16:34  [ТС]     Поиск совершенного числа в массиве #3
katsidelin, как раз таки нет. Мы задаём диапазон исследуемых значений в массиве - от n1-го элемента до n2-го
katsidelin
 Аватар для katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 16:51     Поиск совершенного числа в массиве #4
Прошу прощения, я ответил, не проверив код.
Пока ничего хорошего не получается у меня.
В википедии почитал, что такое совершенное число.
Принцип в складывании натуральных множетлей понял, а при реализации
у меня то вылет за пределы массива, то ошибки при очистки памяти...
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
07.12.2013, 17:00  [ТС]     Поиск совершенного числа в массиве #5
katsidelin, Совершенными называются числа, равные сумме своих делите-
лей, без самого числа. Например, совершенным является число
28 = 1 + 2 + 4 + 7 + 14; 6 = 1 + 2 + 3.
katsidelin
 Аватар для 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 не хватает для быстрого поиска.
Extrim88
 Аватар для 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%
katsidelin
 Аватар для katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 18:02     Поиск совершенного числа в массиве #8
А как же строка p = 0;i++;
?

Добавлено через 2 минуты
Цитата Сообщение от Extrim88 Посмотреть сообщение
Плюс еще вложенный цикл пробегается на каждой итерации внешнего цикла полностью.
Неудивительно, что загрузка ЦП 95.6%
А вот тут я прошу подробнее!
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
07.12.2013, 18:04     Поиск совершенного числа в массиве #9
А где
Цитата Сообщение от katsidelin Посмотреть сообщение
А как же строка p = 0;i++;
?
А где в коде ТС вообще обновление переменной i, кроме как начальная инициализация ее во внешнем цикле for
katsidelin
 Аватар для 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 совершенное
Где повторение?
Extrim88
 Аватар для 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;
* * }
а не про ваш. Разбираем же, кажется, где ошибка в коде у ТС. Все, что я писал ранее, относится к этому куску кода.
katsidelin
 Аватар для katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 18:14     Поиск совершенного числа в массиве #12
C++
1
j = 1;
Если тут поставить вместо единицы i, то потеряются делители...
Натыкайте меня носом, увы не понимаю ????

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

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

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

Добавлено через 9 минут
katsidelin, не могли бы вы подсказать, как теперь вывести на экран сообщение о том, что совершенных чисел не найдено? Ну т.е. если этих чисел нет в исследуемом диапазоне, то должно выводится это сообщение
katsidelin
 Аватар для katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
07.12.2013, 20:34     Поиск совершенного числа в массиве #16
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
// [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] = {2, 4, 6, 9, 12, 80, 82, 90, 30, 38, 85, 88, \
                              130, 230, 230}; // 16 элементов для начала. 0-15.
 
    bool szFind = false; // Перменная для неудовлетворения решения.
 
    /* +++++++++++++++++++++++++++++++ */
    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";
                szFind = true; // Вот!
            };
            p = 0;i++;
        }
 
        if ( szFind == false ) cout << "\n\tВ указанном диапазоне нет совершенных чисел!\n" << endl;
 
    return 0;
}
 
/*
 * Совершенное числоМЃ (др.-греч. бјЂПЃО№ОёОјбЅёП‚ П„О*О»ОµО№ОїП‚) — натуральное число, равное сумме всех своих собственных делителей
 * (т. е. всех положительных делителей, отличных от самогоМЃ числа). По мере того как натуральные числа возрастают,
 *  совершенные числа встречаются всё реже.
 *
 * Совершенные числа образуют последовательность:
 *
 *   6, 28, 496, 8128, 33550336, 8589869056, 137438691328,
 *   2305843008139952128, 2658455991569831744654692615953842176,
 *   191561942608236107294793378084303638130997321548169216, … (последовательность A000396 в OEIS).
 */
Исходный диапазон не занию как править.
Вот вывод из консоли:
Bash
1
2
3
4
5
6
7
$ g++ -c search_cin_2.cpp -o s_2.o
$ g++ -o p2 s_2.o
$ ./p2
Введите n1 = 0
Введите n2 = 1
 
        В указанном диапазоне нет совершенных чисел!
Добавлено через 10 минут
Я тут кроссирую программу.
Походу где-то недоработака, но не пойму где...
В зависимости от выбранного диапазона решение меняется с правильного на неправильное.
То находятся числа, не заданные в массиве, то не находятся заданные совершенные...
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
08.12.2013, 00:14  [ТС]     Поиск совершенного числа в массиве #17
katsidelin, я и сам вижу, что что то не так
и сообщение если таких чисел нет у меня не появляется, хотя делал так, как вы советовали
Fintt
 Аватар для Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
08.12.2013, 00:33     Поиск совершенного числа в массиве #18
Всё работает и всё показывает, перед return поставил system("pause"); или мб я не так понял.
Кротяка
 Аватар для Кротяка
5 / 5 / 0
Регистрация: 20.12.2010
Сообщений: 370
08.12.2013, 00:52  [ТС]     Поиск совершенного числа в массиве #19
Fintt, у меня _getch() стоит, дело не в этом

Добавлено через 36 секунд
проблема в том, что например у меня прога и 0 видит как совершенное число

Добавлено через 28 секунд
и не отображает, что совершенных чисел не найдено, если это так

Добавлено через 24 секунды
и вообще не всегда находит их в исследуемом диапазоне
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2013, 02:32     Поиск совершенного числа в массиве
Еще ссылки по теме:

поиск числа в массиве типа int методом Фибоначчи C++
Поиск числа в символьном массиве C++
Поиск числа в массиве C++

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

Или воспользуйтесь поиском по форуму:
katsidelin
 Аватар для katsidelin
60 / 21 / 2
Регистрация: 15.11.2013
Сообщений: 112
Записей в блоге: 3
08.12.2013, 02:32     Поиск совершенного числа в массиве #20
C++
1
if(p == i && i>0) // т. е. всех положительных делителей, отличных от самогоМЃ числа
С нулём то как раз легко разобраться, а со вторым условием пока не знаю.
Долго думал над кодом.
x, по идее, можно из него вообще выкинуть, оставив i, но проблема пока не решена до конца.

Добавлено через 10 минут
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
81
82
// [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 int MasSize = 17;   // число элементов массива. 0-16. Считая 0 - 17 Элементов.
 
    const long int mas[MasSize] = {-2, 0, 6, 10, 13, 28, 82, 90, 30, 38, 85, 88, \
                              130, 230, 230}; // 16 элементов для начала. 0-15.
    // 16-ый элемент - строковой терминатор '\0', который сообщает о конце массива. Он нам не нужен.
 
    bool szFind = false; // Перменная для неудовлетворения решения.
 
    /* +++++++++++++++++++++++++++++++ */
    int n1 = 0, n2 = 0;
    do
    {
        //задаём диапазон исследуемых элементов
        cout<<"Введите n1 = ";
        cin>>n1;
        if ( n1 >= 0 && n1 <= (MasSize-2) )
        {
            cout<<"Введите n2 = ";
            cin>>n2;
 
            if ( n2 < 0 || n2 > (MasSize -2) )
            {
                 cerr << "n2 вышло за пределы массива! Пробуем занова!" << endl;
            };
        }
        else
        {
            cerr << "n1 вышло за пределы массива! Пробуем занова!" << endl;
        };
        if (n1>n2) cerr <<"n1 должно быть меньше n2!"<<endl;
    } while ( n1 < 0 || n1 > (MasSize -2) || n2 < 0 || n2 > (MasSize -2) || n1 > n2 );
 
    //находим совершенные числа
//        long int x,i,j,p;
        long int i,j,p;
        for(i = n1; i <= n2; n1++){
            cout << i << '\t' << mas[i] << endl;    // Для отладки кода.
//            x = i;
// А зачем вообще x ?
//            for(j = 1; j < x; j++){
              for(j = 1; j < mas[i]; j++){
//                if(x % j == 0)
                  if(mas[i] % j == 0 && j != mas[i])
                    p+=j;
            }
            if(p == mas[i] && mas[i]>0) // т. е. всех положительных делителей, отличных от самогоМЃ числа
            {
                cout<< "Число " << mas[i] << " совершенное\n";
                szFind = true; // Вот!
            };
            p = 0;
            i++;
        }
 
        if ( szFind == false ) cout << "\n\tВ указанном диапазоне нет совершенных чисел!\n" << endl;
 
    return 0;
}
 
/*
 * Совершенное числоМЃ (др.-греч. бјЂПЃО№ОёОјбЅёП‚ П„О*О»ОµО№ОїП‚) — натуральное число, равное сумме всех своих собственных делителей
 * (т. е. всех положительных делителей, отличных от самогоМЃ числа). По мере того как натуральные числа возрастают,
 *  совершенные числа встречаются всё реже.
 *
 * Совершенные числа образуют последовательность:
 *
 *   6, 28, 496, 8128, 33550336, 8589869056, 137438691328,
 *   2305843008139952128, 2658455991569831744654692615953842176,
 *   191561942608236107294793378084303638130997321548169216, … (последовательность A000396 в OEIS).
 */
У меня всё работает.
Компилятор gcc 4.8.2 на GNU/Linux

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

Добавлено через 7 минут
Цитата Сообщение от Кротяка Посмотреть сообщение
katsidelin, я и сам вижу, что что то не так
и сообщение если таких чисел нет у меня не появляется, хотя делал так, как вы советовали
Вероятно вы забыли про фигурные скобки после if:
Цитата Сообщение от katsidelin Посмотреть сообщение
if(p == mas[i] && mas[i]>0) // т. е. всех положительных делителей, отличных от самого́ числа
{ cout<< "Число " << mas[i] << " совершенное\n";
szFind = true; // Вот!
};
Yandex
Объявления
08.12.2013, 02:32     Поиск совершенного числа в массиве
Ответ Создать тему
Опции темы

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