Вопрос № 145174: Здравствуйте, уважаемые эксперты! Подскажите пожалуйста, можно ли на основе побитовых операторов получить выигрыш в скорости, а то на операторах mod, div, odd теряется слишком много времени. Вот предполагаемые варианты программ: var mas:a...Вопрос № 145225: здравствуйте,уважаемые эксперты... помогите ,пожалуйста,решить вот эти задачи... 1)Составить программу,которая находит наибольшее значение отношения трехзначного числа
к сумме его цифр. 2)Написать программу,которая вычисляет наибольший общий...Вопрос № 145236: Спасибо за предыдущие задачи... помогите решить еще одну,пожалуйста. Написать программу,которая проверяет является ли целое число,введенное пользователем,простым. Заранее спасибо......
Вопр
ос № 145.174
Здравствуйте, уважаемые эксперты! Подскажите пожалуйста, можно ли на основе побитовых операторов получить выигрыш в скорости, а то на операторах mod, div, odd теряется слишком много времени. Вот предполагаемые варианты программ: var mas:array[1..8,1..8]of {с типом тоже надо определиться}; {варианты типа - boolean, char, shortint}
1 программа) for i:=1 to 8 do for j:=1 to 8 do mas[i,j]:={...};
2 программа) for i:=1 to 64 do begin x:=((i-1)div 8)+1;
y:=((i-1)mod 8)+1; z:=odd(i); {необходима в дальнейшем. ИМХО тот текст прогрммы не ускорим} mas[x,y]:={...}; end;
В дальнейшем используются проверки (первая программа), в зависимости от типа: if (i in [1..8])and(j in [1..8])and (mas[i,j] или mas[i,j]=' ' или mas[i,j]=0) then {...}
ВОПРОСЫ: 1) Можно ли на основе побитовых операторов получить переменные x,y,z (во второй прогрмме), чтобы она работала быстрее первой про
граммы и как это сделать? 2) Какой тип лучше использовать для ускорения вычисления условия? 3) Как более быстро осуществлять определение вхождение числа в диапазон? варианты i in [1..8] i>0 and i<9 I>0 или i<9 при условии, что перед сравнением i соответственно уменьшилось или увеличилось, но тогда вопрос 3,1. 3.1) Можно ли на основе побитовых операторов добиться ускорения (см. вопрос 3) и как это сделать?
Первая программа после компиляции будет выглядеть примерно так:
Код:
for1: i:= 1; for2: j:= 1; mas[i,j]:={...}; inc(j); if (j <> 9) then goto for2; inc(i); if (i <> 9)
then goto for1;
Вторая программа c использованием побитовых операций будет выглядеть так:
Код:
for: i:= 0 x:= i; x:= x shr 3; {x:= x div 8} Inc(x); y:= i; y:= y and 7; {y:= y mod 8} Inc(y); z:= i;
z:= z and 1; {z:= Odd(i+1)} mas[x,y]:={...} Inc(i); if (i <> 64) goto for;
Что здесь наблюдается? Вторая программа выглядит явно менее привлекательной и, могу гарантировать, будет работать немного медленнее первой за счет наличия дополнительных операций.
Производительность (i in [1..8]) и ((i > 0) and (i < 9)) решил выполнить с помощью цикла. Время выполнения вычислял с помощью функции GetTime (находится в модуле Dos). Вывод такой: 1 миллиард сравнений
(тип Longint) - (i in [1..8]) выполнен за 9.12 секунд; - ((i > 0) and (i < 9)) выполнен за 9.84 секунд. Т.е. в моем случае вторая конструкция работает на 7% медленнее. Если за 1 млрд. итераций теряется всего лишь 700 миллисекунд, то для, допустим, 1 млн. это уже меньше одной миллисекунды. Так что, по моему мнению, можно выбирать любую из этих двух конструкций на Ваш вкус, потеря производительности будет ничтожно мала.
Насчет последнего пункта В
ашего вопроса. Дизассемблировав полученную после компиляции программу, сделал выводы, что компилятор делает определенную оптимизацию.
Варианты 1а), 1б) и 1в) выглядят абсолютно одинаково: inc eax и dec eax
Варианты 2а) и 2б) тоже идентичны: add eax, N и sub eax, N
Так что можете использовать любую удобную конструкцию (мне больше по душе Inc - наглядный и не нужно думать насчет наличия оптимизации кода в компиляторе).
Успехов! --------- Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн
Ответ отправил: Denisss (статус: Профессор) Россия, Москва ICQ: 281599577 ---- Ответ отправлен: 30.09.2008, 15:20 Оценка за ответ: 5 Комментарий оценки: По-моему ответ достойный текущего статуса (на данный момент профессора). Из данного ответа узнал новые способы организации циклов (использую FOR).
Под кое-какие моменты еще придется мне подстраиваться, но это уже недостатки самого вопроса, а не ответа, так что однозначно 5.
Вопрос № 145.225
здравствуйте,уважаемые эксперты... помогите ,пожалуйста,решить вот эти задачи... 1)Составить программу,которая находит наибольшее значение отношения трехзначного числа к сумме его цифр. 2)Написать программу,которая вычисляет наибольший общий делитель двух целых чисел
Отвечает: Шичко Игорь
Здравствуйте, Заболотских Татьяна Сергеевна! Предлагаю вариант решения задач в Delphi Код в приложении Переменные: i - счетчик a, b - вводимые числа для второй задачи del - максимаольный делитель для второй задачи min - минимальное число из введенных temp - временная переменная max_del - наибольшее отношение для первой задачи
Приложение:
Ответ отправил: Шичко Игорь (статус: 6-ой класс)
Ответ отправлен: 27.09.2008, 21:40 Оценка за ответ: 5 Комментарий оценки: спасибо большое...вы мне очень,очень сильно помогли...
Отвечает: Denisss
Здравствуйте, Заболотских Татьяна Сергеевна!
В приложении находятся примеры задач.
В первой задаче получается отношение 100. В общем, это и так понятно. Сами судите, для чисел 100, 200, 300, ..., 900 отношение равно 100. Далее любые отношения меньше в несколько раз (101/2=50.5; 201/3=67; 301/4=75.5; ...; 901/10=90.1).
--------- Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн
Ответ отправил: Denisss (статус: Профессор) Россия, Москва ICQ: 281599577 ---- Ответ отправлен: 27.09.2008, 21:49 Оценка за ответ: 5 Комментарий оценки: спасибо большое!!!! вы мне очень помогли....теперь буду знать к кому обращаться.....спасибо еще раз...
Вопрос № 145.236
Спасибо за предыдущие задачи... помогите решить еще одну,пожалуйста. Написать программу,которая проверяет является ли целое число,введенное пользователем,простым.
Отвечает: -=Dr. Штопор=-
Здравствуйте, Заболотских Татьяна Сергеевна! Программа в приложении.
Приложение:
--------- Tantum possumus, quantum scimus
Ответ отправил: -=Dr. Штопор=- (статус: Студент)
Ответ отправлен: 27.09.2008, 22:37
Отвечает: Denisss
Здравствуйте, Заболотских Татьяна Сергеевна!
В приложении находится пример. Функция isSimple(Integer) возвращает True, если число простое и False в ином случае. Список первых 500 простых чисел для проверки примера можно найти здесь: Список простых чисел
Удачи!
Приложение:
--------- Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн
Ответ отправил: Denisss (статус: Профессор) Россия, Москва ICQ: 281599577 ---- Ответ отправлен: 27.09.2008, 22:42