Большой Воронежский Форум
Страница 2 из 3
< 12 3 >
» Программирование>Народ помогите с двумя переменными ...
relusion 08:54 25.08.2008
Нужно четко понимать.
Нужна ли подобная "оптимизация"... как тут справедливо заметили... что если нет ресурсов и т.п. знание архитектуры даст больше плюсов чем подобные извращения... а в результате такой чудо оптимизации пострадает сам код и его понимание... хорошо если вы сравнили числа через вычитание одного из другого... а когда таких финтов наберется десяток.. то код можно выбросить... имхо.
И уж темболее такие извращения не нужны в скриптованных и Runtime языках... т.к. "на лету" происходит оптимизация.
Скорее тот кто на собеседовании приводит такие задачи(темболее на вакансию 1С программиста...)... просто страдает комплексами... мое ИМХО. [Ответ]
MadFish 11:41 25.08.2008

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

ага, а еще есть понятие локальных переменных и область видимости так что чел делал все правильно!!! ИМХО

народ, ну как же решается задачка с максимумом двух чисел??? интересно же...
[Ответ]
RDS 12:41 25.08.2008

Сообщение от MadFish:
народ, ну как же решается задачка с максимумом двух чисел??? интересно же...

c=SQRT(a-b)
Print A
ONERROR Print b

Типа вот так... [Ответ]
MadFish 13:00 25.08.2008
RDS, Квадратный корень и перехват эксепшенов это тривиально. Я думал можно решить эту задачу "легкими операциями" (+-*/) [Ответ]
][irurg 13:13 25.08.2008
а чем не устраивает

Сообщение от alexz:
int max(a,b)
{
int d=(a-b)/abs(a-b); //надо ещё отдельно окучить случай когда a==b
return a*(d+1)/2 +b*(d-1)/(-2)
}

?
красиво и по существу.. [Ответ]
MadFish 13:18 25.08.2008

Сообщение от ][irurg:
а чем не устраивает

Сообщение от ][irurg:
abs(a-b)

вот этим. [Ответ]
RDS 13:25 25.08.2008
][irurg,
Допер!
5 балов. [Ответ]
][irurg 13:30 25.08.2008
MadFish, возьмите sqrt((a-b)**2); вместо abs(a-b) , или смущает само применение функций? [Ответ]
MadFish 14:05 25.08.2008
][irurg, нет, смущает что abs(x) по сути это

if x>0
return x
return -1*x

а sqrt в самом легком варианте это алгоритм ньютона, где тоже есть сравнения... [Ответ]
Part!zan 16:01 25.08.2008
Гы-гы. какой я ответ нашел http://groups.google.com/group/comp....eee18e55ea156c
и ишшо темка. http://bytes.com/forum/thread487279.html [Ответ]
Pengvin 16:15 25.08.2008

Сообщение от 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]

как видно одна лишняя команда генерируется. Я вобще с удовольствием хочу узнать по какой причине нам это вобще нужно использовать для переменных ибо я ламер.
[Ответ]
MadFish 17:18 25.08.2008

Сообщение от 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;
[Ответ]
][irurg 09:29 26.08.2008

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

(0**n)*d - не понял.. 0 в любой степени ноль, выражение =0, макс всегда = а.. [Ответ]
MadFish 09:54 26.08.2008

Сообщение от ][irurg:
(0**n)*d - не понял.. 0 в любой степени ноль

кому-то пора ф школу любое число в степени 0 = 1 [Ответ]
][irurg 13:27 26.08.2008

Сообщение от MadFish:
кому-то пора ф школу

нет благодарю
так понимаю x**y означает возведение x в степень y. то бишь в вашей записи 0 в степень n. =0.
хочется пояснений
[Ответ]
MadFish 13:50 26.08.2008

Сообщение от ][irurg:
хочется пояснений

это особая уличная магия

если a<b
то n=0 т.к. a%b=a; => (0**0)=1 и вуаля...
[Ответ]
][irurg 13:59 26.08.2008
аплодировал стоя, весь офис обернулся
последний вопрос, если можно - что за операция a%b? я грешным делом подумал что остаток от деления, но не срасталось...
[Ответ]
MadFish 14:00 26.08.2008
Это и есть остаток от деления... [Ответ]
][irurg 14:10 26.08.2008
0_о
простите но если a=3 b=100000 миллионов (условие a<b )
то как a%b=a ?? отсаток деления 3/100000 миллионов разве равен трем? [Ответ]
MadFish 14:12 26.08.2008

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

а то сколько же?

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

все работает. [Ответ]
][irurg 14:17 26.08.2008
точно ) извиняюсь за сомнения
изящненько [Ответ]
Pengvin 15:24 26.08.2008
MadFish, большое спасибо за объяснения. А то я думал это кодер тот дурак, а это я дурак оказался. Тем более в коде это все видно было я что-то протупил, он же стековый кадр меняет, а не переменную.
PS: это кстати с /Od [Ответ]
Part!zan 17:02 26.08.2008

Сообщение от MadFish:
a%b

К сожалению, это не сработает, если b==0. [Ответ]
MadFish 17:24 26.08.2008

Сообщение от Part!zan:
К сожалению, это не сработает, если b==0.

как раз думаю над этим. если чего придумаю напишу.
И еще реализация ** скорее всего будет содержать сравнения. Ежли кто может, подскажите функцию возвращающую 0 для 0 и 1 для всех остальных чисел... [Ответ]
Part!zan 00:05 27.08.2008
Мне вот интересно, то решение, которое я в инете нашел и на предыдущей странице дал ссылку, оно, типа, никого не заинтересовало или просто никто не заметил? ) А то там все честно, никаких сравнений и вызовов функций, кроме как для получения аргументов из ком. строки и вывода результата. Вот только код писал явно маньяк...

Кстати, я только что допер, что в условии просят не пользоваться оператором сравнения, а не операцией. [Ответ]
The_God 01:33 27.08.2008

Сообщение от Part!zan:
просто никто не заметил

заметил ,) там вабще маньяк програмил его

ps зачем нужно решать такие странные задачи с такими искусственными ограничениями ? [Ответ]
][irurg 09:29 27.08.2008
затем же зачем люди отгадывают загадки или читают детективы )
давайте еще задач красивых и разных [Ответ]
Yandex 12:57 27.08.2008
Part!zan, нашел ты ответ, который я имел в виду, во второй ссылке - "(a+b)/2 + |a-b|/2".
Чего там исхитряться то? Задачку в 10-м классе на информатике давали. [Ответ]
Part!zan 19:48 27.08.2008
Yandex, так модуль числа - это же функция в большинстве языков. И на большинстве платформ нет асмовой операции модуля, поэтому будет сравнение, хоть и неявное. То есть решение не вполне "чистое". А вот "маньяческое" решение чище не бывает. Но разобраться в нем я пока еще не смог ) Да, и мое замечание насчет оператора/операции. Ведь если ограничение только на операторы сравнения (то есть if, switch), то можно вообще обойтись (a<b)? b : a [Ответ]
][irurg 09:22 28.08.2008
насчет маньячного решения- имхо не решение это вовсе, больше похоже на набор операторов. вот, взял на себя труд отредактировать это чудо

Сообщение от :
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);}

[Ответ]
Страница 2 из 3
< 12 3 >
Вверх