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

нахождение совершенных числел - C++

Восстановить пароль Регистрация
 
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
11.06.2013, 14:54     нахождение совершенных числел #1
Привет всем, вот мой код:
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
#include "iostream"
#include "math.h"
#include "stdlib.h"
#include "time.h"
 
int main()
{
    setlocale(LC_ALL,"Russian");
unsigned long int count=0;
while(count <=10000)
{
    count++;
unsigned long int result=1;
for(unsigned long int a=1;a<=count;a++){
    for(unsigned long int b=1; b<=count;b++)
    {
        if(a !=1 && a!=count)
        {
            if(a*b==count)
            {
                
                result+=a;
            }
        }
    }
 
}
    if(result==count)
    
        std::cout<<":"<< result<<"\n";
}
 
 
system ("pause");
return 0;
}
Проблема в том что после числа-496 весь процесс становится... Это связанно с кривизной кода или слабости компа?
П.с. подскажите книжку для изучения С++ и сети, желателно с самых азов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fedorys
 Аватар для Fedorys
487 / 198 / 8
Регистрация: 19.03.2013
Сообщений: 444
11.06.2013, 15:08     нахождение совершенных числел #2
В чем ошибка в коде не скажу, но код кривой.
Во-первых, можно избавиться от проверки условия
C++
1
 if(a !=1 && a!=count)
Более того, здесь должен стоять оператор OR, а не AND. Для этого достаточно при объявлении цикла поставить условия
C++
1
for(unsigned long int a=2; a < count; a++)
Во-вторых, b находить как частное от деления count на a и сразу переходить к нужному значению, а не гонять еще один цикл.
В третьих, сам цикл по числу a можно объявлять только sqrt(count).
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
11.06.2013, 16:50     нахождение совершенных числел #3
Вот самый простой, но самый медленный вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    const size_t N = 30000;
    vector<int> perfects;
    for (size_t i = 1; i != N; ++i) {
        size_t sum = 0;
        for (size_t j = 1; j != i; ++j)
            if (i % j == 0) sum += j;
        if (sum == i) perfects.push_back(i);
    }
 
    for (auto x : perfects) cout << x << ", ";
    return 0;
}
Вот вариант посложнее. Ищет первые 8 совершенных чисел (по алгоритма Мэнли Холла). Больше к сожалению не влезает.
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
bool isSimple(unsigned long long x)
{
    if ( (x != 2 && x % 2 == 0) || x == 1 )
        return false;
    auto _x = static_cast<unsigned long long>( sqrt(x) ) + 1;
 
    for (unsigned long long i = 3; i < _x; ++i)
        if (x % i == 0) return false;
    return true;
}
 
int main()
{
    unsigned long long sum = 0;
    unsigned long long k = 1;
 
    for (char i = 0; i != 32; ++i, k = (k << 1) )
        if ( isSimple(sum += k) )
            cout << (sum * k) << endl;
    return 0;
}
Писал на скорую руку так что могут быть ошибки...
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
11.06.2013, 17:02     нахождение совершенных числел #4
Самый простой и быстрый вариант - забить в константу все совершенные их не так уж и много. а найти их можно хоть самым медленным.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
11.06.2013, 18:22     нахождение совершенных числел #5
Dani, т.е. просто забить константами отсюда ? Читерство)
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
11.06.2013, 18:35     нахождение совершенных числел #6
MrGluck, просто их до миллиона не так уж и много. Пусть отработает хоть медленная программа поиска совершенных чисел, потом их просто забить в константу. Смотря, до сколько нужно.
Но отсюда тоже можно)
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
11.06.2013, 18:36  [ТС]     нахождение совершенных числел #7
Парни, я учусь примерно неделю, я из всего с++ знаю как функции,циклы и переменные создавать. Так что тапками не закидывать если слишком глупые вопросы или кривой код)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
11.06.2013, 18:59     нахождение совершенных числел #8
Dani, 2305843008139952128 в unsigned long long int вроде как еще влазит на х64

Добавлено через 1 минуту
MousePro, вас никто не закидывает, лишь предлагают варианты решения.
1) честно посчитать - там 2 способа дали уже
2) взять числа из последовательности A000396 и считерить
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
11.06.2013, 19:32  [ТС]     нахождение совершенных числел #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Dani, 2305843008139952128 в unsigned long long int вроде как еще влазит на х64

Добавлено через 1 минуту
MousePro, вас никто не закидывает, лишь предлагают варианты решения.
1) честно посчитать - там 2 способа дали уже
2) взять числа из последовательности A000396 и считерить
насчет счетирить, я вот решаю задачки из книги и порой думаю " в книге пишут - не изобретать велосипед", но когда я пишу эти задачки я по сути его и изобретаю... Вопрос: надо ли их вообще решать?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
11.06.2013, 19:56     нахождение совершенных числел #10
MrGluck, в string влазит

Добавлено через 1 минуту
Цитата Сообщение от MousePro Посмотреть сообщение
Вопрос: надо ли их вообще решать?
конечно надо. пробуй сам решать такие задачи, их решение проще загуглить. Вне зависимости от результата: получится их решить или нет, все-равно посмотри как она должна решаться на самом деле, оптимально. Ты увидишь различные пути решения.
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
11.06.2013, 20:05  [ТС]     нахождение совершенных числел #11
191561942608236107294793378084303638130997321548169216 - 10 по счету число... Я даже не знаю сколько это)))
191561942608236107294-дициллионов
933-нониллионов
780-октиллионов


Дальше лень
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
11.06.2013, 20:10     нахождение совершенных числел #12
Цитата Сообщение от MousePro Посмотреть сообщение
191561942608236107294793378084303638130997321548169216 - 10 по счету число... Я даже не знаю сколько это)))
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{89}^{176}{2}^{i}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 10:27     нахождение совершенных числел
Еще ссылки по теме:

Дан одномерный массив А с n целых числел. Нужно подсчитать количество нечетных чисел C++
C++ Найти сумму двух наибольших числел из трех
Поиск совершенных чисел C++

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

Или воспользуйтесь поиском по форуму:
Fedorys
 Аватар для Fedorys
487 / 198 / 8
Регистрация: 19.03.2013
Сообщений: 444
13.06.2013, 10:27     нахождение совершенных числел #13
Цитата Сообщение от MousePro Посмотреть сообщение
насчет счетирить, я вот решаю задачки из книги и порой думаю " в книге пишут - не изобретать велосипед", но когда я пишу эти задачки я по сути его и изобретаю... Вопрос: надо ли их вообще решать?
Для того, чтобы освоить инструмент как раз и надо "изобретать велосипед". Только когда научитесь делать обычные вещи, можно будет переходить к творчеству. Это просто ступени обучения. Так что не парьтесь - изобретайте велосипеды. Просто сравнивайте как можно чаще свои "велосипеды" с чужими. Когда-нибудь ваш "велосипед" окажется круче чужих.
Yandex
Объявления
13.06.2013, 10:27     нахождение совершенных числел
Ответ Создать тему
Опции темы

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