-
11. Data: 2011-05-26 13:07:56
Temat: Re: porownanie wyniku mnozenia integerow
Od: bartekltg <b...@o...pl>
W dniu 2011-05-26 08:40, Paweł Kierski pisze:
> W dniu 2011-05-25 20:39, bartekltg pisze:
> [...]
>> Ktoś podesłał pomysł rozkładu na czynniki pierwsze. Można pociągnąć
>> ten pomysł. Policzymy NWD (najwiekszy wspolny dzielnik)
>> dla wszytkich możliwytch par i będziemy skracać.
>>
***************
>> x=NWD(a,c);
>> a=a/x; c=c/x;
>>
>> i podobnie dla par a:d, b:c, b:d (najpierw skracamy, pozniej
>> liczymy kolejne NWD)
***************
>>
>> Po wszystkich skróceniach, jeśli iloczyny były równe, otrzymamy
>> cztery jedynki.
>
> Drobna poprawka - nie dla wszystkich możliwych par: nie skracamy a:b
> i c:d 8-)
"Wszystkich" oznacza wszystkich wymienionych.
Obramowałem fragment, gdzie wymienione są cztery potrzebne pary.
Zresztą, wersja z pięcioma równościami modulo jest lepsza;)
NWD było raczej jako ciekawostka, jak skorzystać z pomysłu
rozkładu na czynniki pierwsze, ale nie liczyć rozkładu
bezpośrednio (przydługie i nieefektywne).
pozdrawiam
bartekltg
-
12. Data: 2011-05-26 21:14:07
Temat: Re: porownanie wyniku mnozenia integerow
Od: Jędrzej Dudkiewicz <j...@n...com>
On 05/25/2011 01:32 AM, Wiktor S. wrote:
>> w jakim celu?
>> co najwyzej mozna dodac informacje ze a*b moze (ale musi) > MAX_INT
>> ale to nic nie wnosi :)
>
>
> to nam psuje warunek, przykładowo GCC 4.6.0 przy takim czymś
>
> cout << boolalpha << (4*1073741826 == 4*2);
>
> sypie warningiem podczas kompilacji, i niestety, wyświetla true.
Co niestety, co niestety. Undefined behaviour, o ile wiem. Ciesz się, że
w ogóle wyświetla.
JD
-
13. Data: 2011-06-03 14:17:45
Temat: Re: porownanie wyniku mnozenia integerow
Od: Pawel WQLQS <p...@g...com>
On 24 Maj, 20:28, " " <t...@g...SKASUJ-TO.pl> wrote:
> witam,
>
> jak sprawdzic czy dla integerow a,b,c,d zachodzi
>
> a*b == c*d
int NWD(int a, int b)
{
int c;
while (b != 0)
{
c = a % b;
a = b;
b = c;
}
return a;
}
int Signs(int x, int y)
{
if (x == 0 || y == 0)
return 0;
if ((x<0 && y<0) || (x>0 && y>0))
return 1;
return -1;
}
BOOL Check_ABeqCD(int a, int b, int c, int d)
{
int s1 = Signs(a, b);
int s2 = Signs(c, d);
if (s1 != s2)
return FALSE;
if (s1 == 0)
return TRUE;
a = a > 0 ? a : -a;
b = b > 0 ? b : -b;
c = c > 0 ? c : -c;
d = d > 0 ? d : -d;
int nwd = NWD(b, c);
b /= nwd;
c /= nwd;
if (a/c==d/b && a%c==0 && d%b==0)
return TRUE;
return FALSE;
}