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

Поиск совершенного числа N через цикл for - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычисление стоимости покупки с учетом скидки http://www.cyberforum.ru/cpp-beginners/thread34238.html
Написать программу вычисления стоимости покупки с учетом скидки. Скидка 5% предоставляется если сумма больше 1000 рублей, 7% если сумма больше 1500 рублей. Написать программу вычисления стоимости разговора по телефону с учетом 20% скидки, предоставляемой по субботам и воскресеньям. Заранее благодарен.
C++ Заполнение двумерных символьных массивов Помогите пожалуйста в учебниках про строки вообще мало что пишут, как заполнять массив из нескольких строк, с клавиатуры. Без методов класса, желательно с помощью функции gets(), в конкретном примере, заранее спасибо. http://www.cyberforum.ru/cpp-beginners/thread34232.html
Возвращаемое значение функции C++
Здарвствуйте. Моя задача состоит в написании следующей программы: вычислить среднее арифметическое значение элементов матрицы W(L,L), расположенных слева и справа от двух диагоналей. Эта программа программа написана на паскале: uses crt; const nmax=30;{максимальный размер матрицы} var W:arrayof real;{тип матрицы} L,i,j,k:integer; sr:real;{среднее} begin clrscr;...
C++ Реализация программы
#include <iostream> #include <algorithm> #include <numeric> int main() { using namespace std; srand((unsigned)time(NULL)); const int N = 1000; int a;
C++ Общий наибольщий делитель в одномерном массиве http://www.cyberforum.ru/cpp-beginners/thread34168.html
дано: найти общий наибольщий делитель в одномерном массиве ( в массиве все элементы положительны). help me please!
C++ класс Множество помогите решить пожалуйста...исжу на экзамене...требуется срочная помощь Разработайте класс Множество.Класс должен содержать элементы множества как закрытые члены,неявный конструктор,конструктор с параметрами,конструктор копирования,деструктор,методы для вывода данных,определение,если одно множество является подмножеством другого, подробнее

Показать сообщение отдельно
Русдеч
Сообщений: n/a
18.01.2011, 21:31     Поиск совершенного числа N через цикл for
Цитата Сообщение от insolent Посмотреть сообщение
Ничего подобного. Вводил я 10 000 и программа с успехом находила 4 совершенных числа. А время затратила - пару сек
Да, безусловно, числа 6, 28, 496, 8128 оно находит в первые секунды запука программы, но вот пятое число, равное 33 550 336. Компьютер еще до него не добрался, хотя выполняется программа около 10 с половиной часов. Мне интересно, за какое кол-во времени комп найдёт пятое число. Кто нибудь пробовал?

Добавлено через 9 часов 20 минут
Цитата Сообщение от Русдеч Посмотреть сообщение
Да, безусловно, числа 6, 28, 496, 8128 оно находит в первые секунды запука программы, но вот пятое число, равное 33 550 336. Компьютер еще до него не добрался, хотя выполняется программа около 10 с половиной часов. Мне интересно, за какое кол-во времени комп найдёт пятое число. Кто нибудь пробовал?
Скажу сразу, по алгоритму, предложенному пользователем insolent, программа будет искать 5, 6, 7 числа очень долго. Я искал по подобному алгоритму. Но, послу многих часов работы программы, она так и не подобралась к 5-му совершенному.
Ниже представлена программа, которая ищет совершенные числа гораздо быстрее - 0m31.203s потраченного времени на поиск 7-ми совершенных против многочасового поиска 5-го (которого он так и не нашёл - мне надоело ждать).
Из википедии: "Алгоритм построения чётных совершенных чисел описан в IX книге Начал Евклида, где было доказано, что число 2^{p-1}(2^p-1) является совершенным, если число 2^p-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
#include <math.h>
#include <stdio.h>
long sov(long);
long sov(long x)
{
   long i, j, sum;
   short int k;
   //Цикл нахождения ПРОСТОГО числа
   for (i = 2; i <= x; i++)
   {
      sum = 0;
      for (j = 1; j <= sqrt(i); j++)
         if ((i%j == 0) && (i%i == 0))
            sum += 1;
    //Если ПРОСТОЕ число найдено...
      if (sum == 1)
      {
      /*...сравним его с числами 2^k - 1. Если числа равны, умножим число на i.
      Результатом будет совершенное число*/
         for (k = 2; k <= 128; k++)
            if (i == (pow(2, k) - 1))
               printf("Простое: %ld\tСовершенное:%.0f\n", i, i*(pow(2, k-1)));
       }
    }
}
 
main(void)
{
   sov(524287);
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru