Старый 25.08.2008, 08:54   #31   
Klayton
 
Аватар для relusion
 
Сообщений: 2,513
Регистрация: 19.05.2004
Возраст: 42

relusion вне форума Не в сети
Нужно четко понимать.
Нужна ли подобная "оптимизация"... как тут справедливо заметили... что если нет ресурсов и т.п. знание архитектуры даст больше плюсов чем подобные извращения... а в результате такой чудо оптимизации пострадает сам код и его понимание... хорошо если вы сравнили числа через вычитание одного из другого... а когда таких финтов наберется десяток.. то код можно выбросить... имхо.
И уж темболее такие извращения не нужны в скриптованных и Runtime языках... т.к. "на лету" происходит оптимизация.
Скорее тот кто на собеседовании приводит такие задачи(темболее на вакансию 1С программиста...)... просто страдает комплексами... мое ИМХО.
  Ответить с цитированием
Старый 25.08.2008, 11:41   #32   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от Pengvin Посмотреть сообщение
веселый код, например кодера который помешан на указателях у него параметры передавались примерно так:
int foo(int *i)
причем в аргумент есть одна единственная переменная, т.е. это все передавалось int z; foo(&z). Собственно размер указателя на int равен самому int. Т.е. человек слышал, что указатели это круто, но видимо с трудом понимает что они представляют.
Это имхо
ага, а еще есть понятие локальных переменных и область видимости так что чел делал все правильно!!! ИМХО

народ, ну как же решается задачка с максимумом двух чисел??? интересно же...
  Ответить с цитированием
Старый 25.08.2008, 12:41   #33   
просто Гений
 
Сообщений: 3,133
Регистрация: 22.01.2007
Возраст: 51

RDS вне форума Не в сети
Цитата:
Сообщение от MadFish Посмотреть сообщение
народ, ну как же решается задачка с максимумом двух чисел??? интересно же...
c=SQRT(a-b)
Print A
ONERROR Print b

Типа вот так...
  Ответить с цитированием
Старый 25.08.2008, 13:00   #34   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
RDS, Квадратный корень и перехват эксепшенов это тривиально. Я думал можно решить эту задачу "легкими операциями" (+-*/)
  Ответить с цитированием
Старый 25.08.2008, 13:13   #35   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
а чем не устраивает
Цитата:
Сообщение от alexz Посмотреть сообщение
int max(a,b)
{
int d=(a-b)/abs(a-b); //надо ещё отдельно окучить случай когда a==b
return a*(d+1)/2 +b*(d-1)/(-2)
}
?
красиво и по существу..
  Ответить с цитированием
Старый 25.08.2008, 13:18   #36   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от ][irurg Посмотреть сообщение
а чем не устраивает
Цитата:
Сообщение от ][irurg Посмотреть сообщение
abs(a-b)
вот этим.
  Ответить с цитированием
Старый 25.08.2008, 13:25   #37   
просто Гений
 
Сообщений: 3,133
Регистрация: 22.01.2007
Возраст: 51

RDS вне форума Не в сети
][irurg,
Допер!
5 балов.
  Ответить с цитированием
Старый 25.08.2008, 13:30   #38   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
MadFish, возьмите sqrt((a-b)**2); вместо abs(a-b) , или смущает само применение функций?
  Ответить с цитированием
Старый 25.08.2008, 14:05   #39   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
][irurg, нет, смущает что abs(x) по сути это

if x>0
return x
return -1*x

а sqrt в самом легком варианте это алгоритм ньютона, где тоже есть сравнения...
  Ответить с цитированием
Старый 25.08.2008, 16:01   #40   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Гы-гы. какой я ответ нашел http://groups.google.com/group/comp....eee18e55ea156c
и ишшо темка. http://bytes.com/forum/thread487279.html
  Ответить с цитированием
Старый 25.08.2008, 16:15   #41   
IGBT
 
Аватар для Pengvin
 
Сообщений: 534
Регистрация: 09.10.2005

Pengvin вне форума Не в сети
Цитата:
Сообщение от MadFish Посмотреть сообщение
ага, а еще есть понятие локальных переменных и область видимости так что чел делал все правильно!!! ИМХО
незнаю что там насчет локальных переменных и области видимости мы в институтах не обучалися грамоте не разумеем, но посмотрим на это с другой стороны.
Вот я накалякал:
int foo(int* i)
{
*i=10;
return *i;
}
int fooo(int i)
{
i=10;
return i;
}
имеем то что генерирует компилятор VC
Цитата:
; 9 : *i=10;

mov eax, DWORD PTR _i$[ebp]
mov DWORD PTR [eax], 10 ; 0000000aH

; 10 : return *i;

mov eax, DWORD PTR _i$[ebp]
mov eax, DWORD PTR [eax]
Цитата:
; 14 : i=10;

mov DWORD PTR _i$[ebp], 10 ; 0000000aH

; 15 : return i;

mov eax, DWORD PTR _i$[ebp]
как видно одна лишняя команда генерируется. Я вобще с удовольствием хочу узнать по какой причине нам это вобще нужно использовать для переменных ибо я ламер.
  Ответить с цитированием
Старый 25.08.2008, 17:18   #42   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от Pengvin Посмотреть сообщение
mov DWORD PTR _i$[ebp], 10 ; 0000000aH
Вот по этому!!!

А вообще способ передачи параметров не определен, и зависит от целевой платформы (отключи при компиляции оптимизацию и увидишь много интересного )

Если процедура меняет входной параметр, и он необходим в основной программе после выполнения процедуры, его надо передавать по сцылке, ну или указателем кому как нравится.

ЗЫ. а вот такой вариант :

int d=a-b;
int n= a-a%b;
//(если определена функция возведения в степень) **
int max=a-(0**n)*d;

//(если функция возведения в степень не определена тогда только машиннозависимым способом ) **
int k=1&n;
n=n>>1;
k|=1&n;
n=n>>1;
k|=1&n;
//... и так до двоичной размерности int
int max=b+k*d;
  Ответить с цитированием
Старый 26.08.2008, 09:29   #43   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
Цитата:
Сообщение от MadFish Посмотреть сообщение
int d=a-b;
int n= a-a%b;
//(если определена функция возведения в степень) **
int max=a-(0**n)*d;
(0**n)*d - не понял.. 0 в любой степени ноль, выражение =0, макс всегда = а..
  Ответить с цитированием
Старый 26.08.2008, 09:54   #44   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от ][irurg Посмотреть сообщение
(0**n)*d - не понял.. 0 в любой степени ноль
кому-то пора ф школу любое число в степени 0 = 1
  Ответить с цитированием
Старый 26.08.2008, 13:27   #45   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
Цитата:
Сообщение от MadFish Посмотреть сообщение
кому-то пора ф школу
нет благодарю
так понимаю x**y означает возведение x в степень y. то бишь в вашей записи 0 в степень n. =0.
хочется пояснений
  Ответить с цитированием
Старый 26.08.2008, 13:50   #46   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от ][irurg Посмотреть сообщение
хочется пояснений
это особая уличная магия

если a<b
то n=0 т.к. a%b=a; => (0**0)=1 и вуаля...
  Ответить с цитированием
Старый 26.08.2008, 13:59   #47   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
аплодировал стоя, весь офис обернулся
последний вопрос, если можно - что за операция a%b? я грешным делом подумал что остаток от деления, но не срасталось...
  Ответить с цитированием
Старый 26.08.2008, 14:00   #48   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Это и есть остаток от деления...
  Ответить с цитированием
Старый 26.08.2008, 14:10   #49   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
0_о
простите но если a=3 b=100000 миллионов (условие a<b )
то как a%b=a ?? отсаток деления 3/100000 миллионов разве равен трем?
  Ответить с цитированием
Старый 26.08.2008, 14:12   #50   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от ][irurg Посмотреть сообщение
0_о
простите но если a=3 b=100000 миллионов (условие a<b )
то как a%b=a ?? отсаток деления 3/100000 миллионов разве равен трем?
а то сколько же?

результат деления 0, остаток 3

все работает.
  Ответить с цитированием
Старый 26.08.2008, 14:17   #51   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
точно ) извиняюсь за сомнения
изящненько
  Ответить с цитированием
Старый 26.08.2008, 15:24   #52   
IGBT
 
Аватар для Pengvin
 
Сообщений: 534
Регистрация: 09.10.2005

Pengvin вне форума Не в сети
MadFish, большое спасибо за объяснения. А то я думал это кодер тот дурак, а это я дурак оказался. Тем более в коде это все видно было я что-то протупил, он же стековый кадр меняет, а не переменную.
PS: это кстати с /Od
  Ответить с цитированием
Старый 26.08.2008, 17:02   #53   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Цитата:
Сообщение от MadFish Посмотреть сообщение
a%b
К сожалению, это не сработает, если b==0.
  Ответить с цитированием
Старый 26.08.2008, 17:24   #54   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от Part!zan Посмотреть сообщение
К сожалению, это не сработает, если b==0.
как раз думаю над этим. если чего придумаю напишу.
И еще реализация ** скорее всего будет содержать сравнения. Ежли кто может, подскажите функцию возвращающую 0 для 0 и 1 для всех остальных чисел...
  Ответить с цитированием
Старый 27.08.2008, 00:05   #55   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Мне вот интересно, то решение, которое я в инете нашел и на предыдущей странице дал ссылку, оно, типа, никого не заинтересовало или просто никто не заметил? ) А то там все честно, никаких сравнений и вызовов функций, кроме как для получения аргументов из ком. строки и вывода результата. Вот только код писал явно маньяк...

Кстати, я только что допер, что в условии просят не пользоваться оператором сравнения, а не операцией.
  Ответить с цитированием
Старый 27.08.2008, 01:33   #56   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 43

The_God вне форума Не в сети
Цитата:
Сообщение от Part!zan Посмотреть сообщение
просто никто не заметил
заметил ,) там вабще маньяк програмил его

ps зачем нужно решать такие странные задачи с такими искусственными ограничениями ?
  Ответить с цитированием
Старый 27.08.2008, 09:29   #57   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
затем же зачем люди отгадывают загадки или читают детективы )
давайте еще задач красивых и разных
  Ответить с цитированием
Старый 27.08.2008, 12:57   #58   
Кэп Улитка
 
Аватар для Yandex
 
Сообщений: 8,067
Регистрация: 04.05.2005
Возраст: 45

Yandex вне форума Не в сети
Part!zan, нашел ты ответ, который я имел в виду, во второй ссылке - "(a+b)/2 + |a-b|/2".
Чего там исхитряться то? Задачку в 10-м классе на информатике давали.
  Ответить с цитированием
Старый 27.08.2008, 19:48   #59   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Yandex, так модуль числа - это же функция в большинстве языков. И на большинстве платформ нет асмовой операции модуля, поэтому будет сравнение, хоть и неявное. То есть решение не вполне "чистое". А вот "маньяческое" решение чище не бывает. Но разобраться в нем я пока еще не смог ) Да, и мое замечание насчет оператора/операции. Ведь если ограничение только на операторы сравнения (то есть if, switch), то можно вообще обойтись (a<b)? b : a
  Ответить с цитированием
Старый 28.08.2008, 09:22   #60   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
насчет маньячного решения- имхо не решение это вовсе, больше похоже на набор операторов. вот, взял на себя труд отредактировать это чудо
Цитата:
typedef unsigned long q1;
int printf(const char*,...);
long strtol(const char*,char**,int);
q1 q2(q1 q3,q1 q4,q1 q5,q1q6)
{return(q5-q6)*(((((q3-q4)&(q4-q3) )+2)/(((q3-q4)&(q4-q3))+1))-1)+q6;}
q1 q7(long q8)
{return q2(q8,0,q2(q8/2,0,1,0),0);}
q1 q9(long q8)
{return q2(q8,-1,q2(q8/2,-1,1,q2(q8/2,0,1,0) ),0);}
q1 q10(long);
q1 q11(long q8)
{return 0;}
q1 q12(long q8)
{return 1;}
q1 q13(long q8)
{return q10(q8/2);}
q1 q14(long q8)
{q1(*q15[])(long)={q12,q13};return q15[q2(q9(q8),1,0,1)](q8);}
q1 q10(long q8)
{q1(*q15[])(long)={q11,q14};
return q15[ q2(q7(q8),1,0 ,1)](q8);}
q1 q17(long q3, long q4)
{return q2(q10( q3),1,q2(q10(q4),1,q10(q3-q4),1), q2(q10(q4),1 ,0,q10(q3-q4 )));}
long q18(long q3,long q4){return q3;}
long q19(long q3,long q4){return q4;}
long q20(long q3,long q4)
{long(*q15[])(long,long)={q19,q18};
return q15[q2(q17(q3,q4),1,0,1)](q3,q4);}
long q21(const char*q2)
{return strtol(q2,0,10);}
int q22(char **q23)
{printf("%ld""\n",q20(q21(q23[1]),q21(q23[2])));return 0;}
int q24(char**q23)
{return 0;}

int main(int q25,char**q23)
{int(*q15[])(char**)={q24,q22};
return q15[q2(q25,3,1,0)](q23);}
  Ответить с цитированием
Поиск в теме: 


Опции темы

Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind