#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
unsigned int multiply (unsigned short a, unsigned short b)
{
unsigned int result = 0;
char negflag = 0;
if ( (a < 0) != (b < 0) )
{
negflag++;
a &= 0b0111111111111111;
b &= 0b0111111111111111;
}
char n = 0;
while ( b >= (1 << (n)) )
{
if ( b & (1 << n) )
result += a << n;
n++;
}
return result;
}
int main(void)
{
unsigned short a, b;
//scanf("%hi%hi", &a, &b);
a = 1;
b = 1;
//это типа такое юнит-тестирование. Если оно зависает, значит все норм
while (multiply(a, b) == a * b)
{
if (SHRT_MIN == a)
{
b++;
}
a++;
// fprintf(stderr," %i : %i", a,b);
}
fprintf(stderr
,"my: %i ; norm: %i\n", multiply
(a
, b
), a
* b
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgoKdW5zaWduZWQgaW50IG11bHRpcGx5ICh1bnNpZ25lZCBzaG9ydCBhLCB1bnNpZ25lZCBzaG9ydCBiKQp7CiAgdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CiAgY2hhciBuZWdmbGFnID0gMDsKICAKICBpZiAoIChhIDwgMCkgIT0gKGIgPCAwKSApCiAgewogICAgbmVnZmxhZysrOwogICAgYSAmPSAwYjAxMTExMTExMTExMTExMTE7CiAgICBiICY9IDBiMDExMTExMTExMTExMTExMTsKICB9CiAgY2hhciBuID0gMDsKICB3aGlsZSAoIGIgPj0gKDEgPDwgKG4pKSAgKQogIHsKICAgIGlmICggYiAmICgxIDw8IG4pICkKICAgICAgcmVzdWx0ICs9IGEgPDwgbjsKICAgIG4rKzsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKaW50IG1haW4odm9pZCkKewoKICB1bnNpZ25lZCBzaG9ydCBhLCBiOwogIC8vc2NhbmYoIiVoaSVoaSIsICZhLCAmYik7CiAgYSA9IDE7CiAgYiA9IDE7CgogIC8v0Y3RgtC+INGC0LjQv9CwINGC0LDQutC+0LUg0Y7QvdC40YIt0YLQtdGB0YLQuNGA0L7QstCw0L3QuNC1LiDQldGB0LvQuCDQvtC90L4g0LfQsNCy0LjRgdCw0LXRgiwg0LfQvdCw0YfQuNGCINCy0YHQtSDQvdC+0YDQvAogIHdoaWxlIChtdWx0aXBseShhLCBiKSA9PSBhICogYikKICB7CiAgICBpZiAoU0hSVF9NSU4gPT0gYSkKICAgIHsKICAgICAgYisrOwogICAgfQogICAgYSsrOwogICAgLy8gZnByaW50ZihzdGRlcnIsIiAlaSA6ICVpIiwgYSxiKTsKICB9CiAgZnByaW50ZihzdGRlcnIsIm15OiAlaSA7IG5vcm06ICVpXG4iLCBtdWx0aXBseShhLCBiKSwgYSAqIGIpOwoKICByZXR1cm4gMDsKfQo=