Come trovare il pavimento e il resto di una frazione in Java?
Dati gli interi ' a 'e ' b', vorrei un metodo che restituisca il pavimento e il resto di a / b in modo tale che:
- a / b = floor + remainder / / b /(dove |b / è il valore assoluto di b), e
- 0
Ad esempio, 5/3 = 1 + 2/3.
Ecco un tentativo che funziona solo per positivo a
e b
:
public static long[] floorAndRemainder(long a, long b) {
long floor = a / b;
long remainder = a % b;
return new long[] { floor, remainder };
}
Ho bisogno di una funzione che funzioni per tutti i numeratori e denominatori positivi e negativi. Per esempio,
-5/3 = -2 + 1/3
5/-3 = -2 + 1/3
-5/-3 = 1 + 2/3
1 answers
Implementazione 1: Virgola mobile
Utilizza la matematica in virgola mobile per semplificare la logica. Essere avvertito che questo produrrà risultati errati per i grandi numeri a causa della perdita di precisione.
public static long[] floorAndRemainder(long a, long b) {
long floor = (long) Math.floor(a / (double) b);
long remainder = Math.abs(a - floor * b);
return new long[] { floor, remainder };
}
Implementazione 2: Trova, quindi correggi
Trova il pavimento e il resto usando gli operatori di divisione intera e modulo, quindi corregge le frazioni negative. Ciò dimostra che il resto è relativamente difficile da correggere senza usare il pavimento.
public static long[] floorAndRemainder(long a, long b) {
long floor = a / b;
long remainder = a % b;
boolean isNegative = a < 0 ^ b < 0;
boolean hasRemainder = remainder != 0;
// Correct the floor.
if (isNegative && hasRemainder) {
floor--;
}
// Correct the remainder.
if (hasRemainder) {
if (isNegative) {
if (a < 0) { // then remainder < 0 and b > 0
remainder += b;
} else { // then remainder > 0 and b < 0
remainder = -remainder - b;
}
} else {
if (remainder < 0) {
remainder = -remainder;
}
}
}
return new long[] { floor, remainder };
}
Attuazione 3: L'opzione migliore
Trova il floor allo stesso modo dell'implementazione 2, quindi utilizza il floor per trovare il resto come l'implementazione 1.
public static long[] floorAndRemainder(long a, long b) {
long floor = a / b;
if ((a < 0 ^ b < 0) && a % b != 0) {
floor--;
}
long remainder = Math.abs(a - floor * b);
return new long[] { floor, remainder };
}