Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.01.2013, 20:55   #1
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию Ускорить поиск суммы простых чисел С++

Код:
//@Izobara
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
 unsigned long long n, i, j;
 unsigned long long sum=0;
cin >> n;
 bool *a = new bool [n]; // создание массива
for (i = 0; i<n; i++) // и инициализация его всеми единицами
{
   a[i] = true;
};
for (i = 2; i<n; i++) // цикл прохода по всеми массиву с первого простого числа "2"
{
  if (a[i] == true)
{
for (j = i; j<n; j+=i) // вычеркивание всех чисел кратных данному невычеркнутому
{
   a[j] = false;
}
   a[i] = true; // присваивание данному числу значение простого
}
}
 for (unsigned long long i = 2; i<n; i++)
{
  if (a[i] == true)
{
 sum+=i;
}
}
cout<<sum;
  delete [] a;
return 0;
}
Требуется, чтобы сумму чисел в районе миллиарда находило за минуту. На процессоре intel core i7. У меня на intel core 2 duo проходит где-то за 2 минуты. Update: не, за 69 секунд Хех, неплохо.
Я думаю, что это решето Эратосфена. Вроде так называется.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут

Последний раз редактировалось Izobara; 01.01.2013 в 21:54.
Izobara вне форума Ответить с цитированием
Старый 01.01.2013, 22:07   #2
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Я думаю, что это решето Эратосфена. Вроде так называется.
Оно, родимое.
У вас оно за O(n * log(log(n))), но его можно улучшить до O(n). Читать здесь
_-Re@l-_ вне форума Ответить с цитированием
Старый 01.01.2013, 22:37   #3
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Хм, а как это засунуть в мой код? Извините, в С++ я новичок.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 01.01.2013, 23:28   #4
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Ну так кто знает?
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 11.01.2013, 13:28   #5
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Я тут скуки ради просмотрел твою программу. И смог ее оптимизировать до 34 секунд нахождения.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 11.01.2013, 13:31   #6
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Код:
unsigned long long n, i,j;
    unsigned long long summ = 2;
    n = 1000000000;
    bool *a = new bool [n+1]; // создание массива
    for (i = 3; i<n-1; i+=2) {
        a[i] = true;
        a[i+1] = false;
    }

    for (i = 3; i< n; i+=2) // цикл прохода по всеми массиву с первого простого числа "2"
    {
        //ui->textEdit_3->append((QString::number(i) + "  " + QString::number(a[i])));
        if (a[i] == true) {
            for (j = i; j<n; j+=2*i) // вычеркивание всех чисел кратных данному невычеркнутому
            {
                a[j] = false;
            }
            summ += i; // присваивание данному числу значение простого
        }
    }
    delete [] a;
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 11.01.2013, 15:44   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,371
По умолчанию

А что будет если пометить как непростые
i * 3
i * 5
i * 7
i * 11
waleri на форуме Ответить с цитированием
Старый 11.01.2013, 15:52   #8
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А что будет если пометить как непростые
i * 3
i * 5
i * 7
i * 11
Вопрос не совсем понятен. Можно уточнить его?!
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 11.01.2013, 20:55   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,371
По умолчанию

Я сам себя не понял
Идея была пометить заранне на хотя бы базовые множители, исходя из идеи, что много чисел будут делится на 3 или 5 или 7 и для них не надо будет пробовать. Только потом сообразил, что эти множители тоже будут простые числа, т.е. их тоже надо вычислить...
waleri на форуме Ответить с цитированием
Старый 11.01.2013, 21:15   #10
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

На самом деле я так пробовал, но это хорошо работает на первой сотне. А потом не работает. )))
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск простых чисел потоками bors4 Visual C++ 6 04.12.2012 19:36
Поиск простых чисел phreaker228 Помощь студентам 3 03.06.2012 15:24
Поиск простых чисел + поток (C++) Brabus Помощь студентам 4 30.09.2011 08:46
Поиск простых чисел из диапазона dex92 Помощь студентам 2 21.05.2010 09:40
Определить представимо ли число содержащиеся в ячейке 0200 в в виде суммы 2х простых чисел. Lenusy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 06.10.2009 08:26