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
Author: dln385, 2014-11-20

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 };
}
 3
Author: dln385, 2014-11-19 22:24:14