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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2012, 19:59   #1
-=M{a}LoY=-
Пользователь
 
Аватар для -=M{a}LoY=-
 
Регистрация: 17.11.2010
Сообщений: 15
По умолчанию Увеличение быстродействия

Добрый вечер.
Задача относительно простая : найти все делители числа 600851475143. Но если делать в лоб, то это занимает ужасно много времени.
Подскажите, как можно увеличить быстродействие такой программки.
-=M{a}LoY=- вне форума Ответить с цитированием
Старый 24.09.2012, 20:32   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ну собственно все числа кроме нуля, это если без спецслучаев . Или Вы имеете ввиду целые делители для получения целого числа? Тогда рассматривайте только нечетные. Далее - данное число не делится на 3 (сумма всех цифр числа не делится на три). Это значит, что данное число не будет делится на все числа, которые можно без остатка поделить на 3. То есть не будет делится на 9, 12, 15, 18 и т.д. Не будет делится на 4, потому что четное. Число не делится на 5, а значит не будет делиться и по аналогии с 3-кой - на 10, 15, 20, 25 и т.д. Тенденция ясна? Совершенно очевидно, что нужно пытаться делить только на такие числа, которые делятся на самих себя. Кроме того, я подозреваю что и данное число является простым - то есть делится только на само себя (ну и единицу естественно ибо на нее все делится) .

--ДОБАВЛЕНО---
Делится: 71*839*1471*6857
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 24.09.2012 в 20:42.
Utkin вне форума Ответить с цитированием
Старый 24.09.2012, 21:13   #3
-=M{a}LoY=-
Пользователь
 
Аватар для -=M{a}LoY=-
 
Регистрация: 17.11.2010
Сообщений: 15
По умолчанию

Спасибо) Суть ясна
А вот если увеличивать быстродействие по средством увеличения выделяемой для этой задачи памяти или что то подобное этому?)
Может я не совсем правильно выразился, я только учусь
Надеюсь поймете, что я хочу
-=M{a}LoY=- вне форума Ответить с цитированием
Старый 24.09.2012, 21:19   #4
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

Вот памяти как раз таки нужно выделять ровно столько сколько нужно, не больше, не меньше. Выделение лишней памяти наоборот будет тормозить выполнение.
Axrik вне форума Ответить с цитированием
Старый 24.09.2012, 21:20   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Вы сначала составьте алгоритм без учета аппаратных требований.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 24.09.2012, 22:52   #6
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Наваял нечто такое:
Код:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<size_t> simple_numbers = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
                                     61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131,
                                     137, 139, 149, 151, 157};
    simple_numbers.reserve(50);
    size_t X = 137814600;
    size_t sqrt_X = sqrt(X) + 1;
    size_t Last = X;
    while(X > 1)
    {
        for(size_t i = 0; i < simple_numbers.size(); i++)
        {
            if(simple_numbers[i] > sqrt_X)
            {
                cout << X << " ";
                X = 1;
                break;
            }
            switch(i)
            {
            case 0:
                if(!(X & 1))
                {
                    cout << 2 << " ";
                    X /= 2;
                    i = simple_numbers.size();
                }
            break;
            default:
                if(!(X % simple_numbers[i]))
                {
                    cout << simple_numbers[i] << " ";
                    X /= simple_numbers[i];
                    i = simple_numbers.size();
                }
            break;
            }
        }
        if(X == Last)
        {
            size_t d = simple_numbers[simple_numbers.size()-1];
            do
            {
                d++;
                if(d > sqrt_X)
                {
                    d = X;
                    X = 1;
                    break;
                }
            }
            while(X % d);
            if(X > 1)
            {
                X /= d;
                //simple_numbers.push_back(d); ??
            }
            cout << d << " ";
        }
        sqrt_X = sqrt(X) + 1;
        Last = X;
    }
    return 0;
}
Правда сомневаюсь в работоспособности некоторых моментов, но в целом вроде работает. Сомнения вызывают закомментированная строчка ??, вроде как ее можно раскомментить и все будет работать хорошо.

Советую почитать книгу: http://www.ozon.ru/context/detail/id/4893803/

Последний раз редактировалось Kostia; 24.09.2012 в 22:55.
Kostia вне форума Ответить с цитированием
Старый 24.09.2012, 23:37   #7
-=M{a}LoY=-
Пользователь
 
Аватар для -=M{a}LoY=-
 
Регистрация: 17.11.2010
Сообщений: 15
По умолчанию

Ооо ... спасибо ) Буду разбираться
За книгу отдельное спасибо
-=M{a}LoY=- вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Увеличение быстродействия chui БД в Delphi 5 17.10.2011 15:48
MySQL - увеличение быстродействия Linel SQL, базы данных 8 17.01.2011 13:39
Сравнение быстродействия ChaosDev Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 22.11.2010 03:32
Вопрос быстродействия _Денис C++ Builder 1 14.11.2009 17:00
Сравнение быстродействия алгоритмов Pti44ka Помощь студентам 9 13.11.2009 13:41