help4e

17 отговора 538 прегледа
#1

help4e

zada4ka za C
Da se sastavi programa za namirane na proizvedenieto na 2 te nai golemi ot 3 te 4isla x y z

Отговор
в отговор на deriled #2

Re: help4e

int mult(int *intarr) {

return (*intarr - ((*intarr - *(intarr+1)) & \
((*intarr - *(intarr+1)) >> 31))) * \
((*(intarr+2) - ((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> 31)))) &\
((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> 31)))) >> 31))));

}

тая функция я викаш като и подадеш произволен масив от int и тя пряви квото се търси с първите 3 члена. може и по-конкретно да се напише, но така изглежда много забавно...

Отговор
в отговор на heh #3

Re: help4e

смени 31 с (sizeof(int)*8-1), за да работи на различни от 32-битови машини

Отговор
в отговор на hehe #4

Re: help4e

int mult(int *intarr) {

return (*intarr - ((*intarr - *(intarr+1)) & \
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1)))) * \
((*(intarr+2) - ((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1))))) &\
((*(intarr+2) - (*(intarr + 1) + ((*intarr - *(intarr+1)) &\
((*intarr - *(intarr+1)) >> (sizeof(int)*8-1))))) >> (sizeof(int)*8-1)))));

}

ето спагетите са готови

Отговор
в отговор на hehe #5

Re: help4e

mersi mnogo
ama nqma li po-lesen na4in
tezi ne6ta o6te ne sme gi u4ili :(

Отговор
в отговор на deriled #6

Re: help4e

Има и по лесен:
double mul3(double x, double y, double z){

return (max(x,y) == max(y,z))
?y * max(x,z)
:max(x,y) * max(y,z);
}



А на хехе начина е жесток. Но бачка само с int.

Отговор
в отговор на eфp. Лyk #7

Re: help4e

що да не бачка, верно, че ще стане още по-мазало, ама става и така:
подаваш float * , после на всеки елемент
(float)(*(int *)(intarr+1)>>=31) и т.н. вече ще изглежда весело...
^+0/+2 и т.н.

ще си работи и за double, long double

Отговор
в отговор на hehe #8

Re: help4e

не на всеки елемент, а на всяка разлика, която трябва да се шифт-ва..

Отговор
в отговор на hehe #9

Re: help4e

всъщност понеже само знака е важен може и така
(float)((int)razlika>>31)

и т.н.

Отговор
в отговор на xexe #10

Re: help4e

Би ли написал твоята цяла функция за double моля, защото нямам никаква представа къде да го сложа този израз (float)((int)razlika>>31). Отделно ако функцията ти въобще работи не знам как го прави.

Отговор
в отговор на eфp. Лyk #11

Re: help4e

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

Отговор
в отговор на hehe #12

Re: help4e

ето:

double multd(double *intarr) {

double diff = *intarr - *(intarr+1);
long long shift = *(long long*)&diff & ((long long)diff >> (sizeof(int)*8-1));
double nestdiff = *(intarr+2) - (*(intarr + 1) + *(double *)&shift);
long long nestshift = *(long long*)&nestdiff & ((long long)nestdiff >> (sizeof(int)*8-1));

return (*intarr - *(double *)&shift) * ((*(intarr+2) - *(double *)&nestshift));

}

със сигурност може да се оптимира малко и да се поопрости, но не ми се занимава повече за сега...

Отговор
в отговор на hehe #13

Re: help4e

Това беше гадно и работи.

Признавам те.

Отговор
в отговор на eфp. Лyk #14

Re: help4e

не работеше съвсем вярно:), сега вече да -

double multd(double *intarr) {

double diff = *intarr - *(intarr+1);
long long shift = *(long long*)&diff & (*(long long*)&diff >> (sizeof(long long)*8-1)); //was sizeof(int)
double nestdiff = *(intarr+2) - (*(intarr + 1) + *(double *)&shift);
long long nestshift = *(long long*)&nestdiff & (*(long long*)&nestdiff >> (sizeof(long long)*8-1));

return (*intarr - *(double *)&shift) * ((*(intarr+2) - *(double *)&nestshift));

}

Отговор
в отговор на hehe #15

Re: help4e

ахаха *respect*

Машина за отделяне на кожа и сланина от парени свине
Отговор
в отговор на heh #16

Re: help4e

Мдаа снощи случайно попаднах на нещо по въпроса

Начи ако има препълване тoва не дава верен резултат:
d = x - y
d&(d >> 31).


Примерно

long la[3] = {-1547483648, 1, 1547483648};
cout << mult(la) << "\n";

дава -1547483648.

Според пича най-простото и винаги работещо е

d = x-y
d&((d^( (x^y)&(d^x)))>>31)

Машина за отделяне на кожа и сланина от парени свине
Отговор
в отговор на Maтa Kocмaтa #17

Re: help4e

наистина готино и елегентно решение...

Отговор