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

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

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

Показать сообщение отдельно
Русдеч
Сообщений: 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);
}
 
Текущее время: 08:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru