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

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

Войти
Регистрация
Восстановить пароль
 
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
#1

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

11.06.2013, 14:54. Просмотров 525. Ответов 12
Метки нет (Все метки)

Привет всем, вот мой код:
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 весь процесс становится... Это связанно с кривизной кода или слабости компа?
П.с. подскажите книжку для изучения С++ и сети, желателно с самых азов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос нахождение совершенных числел (C++):

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

нахождение всех совершенных чисел среди элементов целочисленного массива ( С++ ) - C++
Привет всем))) Помогите пожалуйста! Разработать программу для нахождения всех совершенных чисел среди элементов целочисленного...

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

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

Найти сумму двух наибольших числел из трех - C++
Даны три различных числа. Найти сумму двух наибольших из них. с++ с формой.

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

12
Fedorys
489 / 200 / 9
Регистрация: 19.03.2013
Сообщений: 450
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).
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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;
}
Писал на скорую руку так что могут быть ошибки...
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
11.06.2013, 17:02 #4
Самый простой и быстрый вариант - забить в константу все совершенные их не так уж и много. а найти их можно хоть самым медленным.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7526 / 4664 / 704
Регистрация: 29.11.2010
Сообщений: 12,740
11.06.2013, 18:22 #5
Dani, т.е. просто забить константами отсюда ? Читерство)
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
11.06.2013, 18:35 #6
MrGluck, просто их до миллиона не так уж и много. Пусть отработает хоть медленная программа поиска совершенных чисел, потом их просто забить в константу. Смотря, до сколько нужно.
Но отсюда тоже можно)
0
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
11.06.2013, 18:36  [ТС] #7
Парни, я учусь примерно неделю, я из всего с++ знаю как функции,циклы и переменные создавать. Так что тапками не закидывать если слишком глупые вопросы или кривой код)
0
MrGluck
Модератор
Эксперт CЭксперт С++
7526 / 4664 / 704
Регистрация: 29.11.2010
Сообщений: 12,740
11.06.2013, 18:59 #8
Dani, 2305843008139952128 в unsigned long long int вроде как еще влазит на х64

Добавлено через 1 минуту
MousePro, вас никто не закидывает, лишь предлагают варианты решения.
1) честно посчитать - там 2 способа дали уже
2) взять числа из последовательности A000396 и считерить
0
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 и считерить
насчет счетирить, я вот решаю задачки из книги и порой думаю " в книге пишут - не изобретать велосипед", но когда я пишу эти задачки я по сути его и изобретаю... Вопрос: надо ли их вообще решать?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
11.06.2013, 19:56 #10
MrGluck, в string влазит

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


Дальше лень
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
11.06.2013, 20:10 #12
Цитата Сообщение от MousePro Посмотреть сообщение
191561942608236107294793378084303638130997321548169216 - 10 по счету число... Я даже не знаю сколько это)))
http://www.cyberforum.ru/cgi-bin/latex.cgi?\sum_{89}^{176}{2}^{i}
0
Fedorys
489 / 200 / 9
Регистрация: 19.03.2013
Сообщений: 450
13.06.2013, 10:27 #13
Цитата Сообщение от MousePro Посмотреть сообщение
насчет счетирить, я вот решаю задачки из книги и порой думаю " в книге пишут - не изобретать велосипед", но когда я пишу эти задачки я по сути его и изобретаю... Вопрос: надо ли их вообще решать?
Для того, чтобы освоить инструмент как раз и надо "изобретать велосипед". Только когда научитесь делать обычные вещи, можно будет переходить к творчеству. Это просто ступени обучения. Так что не парьтесь - изобретайте велосипеды. Просто сравнивайте как можно чаще свои "велосипеды" с чужими. Когда-нибудь ваш "велосипед" окажется круче чужих.
1
13.06.2013, 10:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 10:27
Привет! Вот еще темы с ответами:

Программа для вывода последовательности сначала четных, а потом нечетных числел на заданном отрезке - C++
Числа а и b (начало и конец данного отрезка) являются вещественными Добавлено через 8 минут Помогите написать данную программу на c++

Поиск совершенных чисел - C++
Суть задачи: Вывести n первых совершенных чисел(натуральное число называется совершенным, если равно сумме всех своих делителей, исключая...

Поиск совершенных чисел - C++
Нужно написать программу для поиска совершенных чисел. Вот код int main() { int a=1,c,n=1,delitel; while(a&lt;=10000) { ...

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


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

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

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