Witam wszystkich zastanawiałem się, czy istnieje sposób wdrożenia tej metody bez przesyłania do szerszego typu danych (np. długi, podwójny itp.)?Czy istnieje algorytm określający, czy a * b mieści się w możliwych wartościach liczby całkowitej? (bez rzutowania na szerszy typ)
CanTimes(int a, int b){
returns true if a * b is within the range of -2^31 to 2^31-1, else false;
}
Na przykład moglibyśmy wdrożyć jedną dla metody CanAdd
(bez poświaty) jako takie:
public static boolean CanPlus(int a, int b) {
if (b >= 0) {
return a <= Integer.MAX_VALUE - b
} else {
return a >= Integer.MIN_VALUE - b
}
}
język Wdrożenie jest Java, choć oczywiście jest to większym problemem językowym-agnostykiem.
Zastanawiam się, czy istnieje jakaś logika, którą możemy zastosować, aby zdecydować, czy a * b mieści się w zakresie liczby całkowitej bez rzucania go do szerszego typu danych?
Rozwiązanie! na podstawie komentarza zStrelok:
public static boolean CanTimes(int a, int b) {
if (a == 0 || b == 0) {
return true;
}
if (a > 0) {
if (b > 0) {
return a <= Integer.MAX_VALUE/b;
} else {
return a <= Integer.MIN_VALUE/b;
}
} else {
if (b > 0) {
return b <= Integer.MIN_VALUE/a;
} else {
return a <= -Integer.MAX_VALUE/b;
}
}
}
Dlaczego? Dlaczego sztuczne ograniczenie? – EJP
Może możesz zrobić coś z 'Integer.numberOfLeadingZeros'. Jeśli suma obu wiodących zer jest większa niż 31, nadal będzie to int lub coś podobnego. – Thilo
@EJP To nie jest sztuczne ograniczenie, zastanawiam się, czy istnieje sposób, aby to zrobić bez konieczności przesyłania do szerszego typu danych. Na przykład HeadGeek ma pół-rozwiązanie tutaj http://stackoverflow.com/a/199455/632951. Jego szacunek jest jednak interesujący, w jaki sposób możemy go ulepszyć, tak aby faktycznie działał. – Pacerier