I was searching around about this topic but I still don\'t get it, if someone can elaborate I would be very thankful.
My task is to divide two variables as integer d
%
operator will return the remainder of the Integer division.
What modules actually does under the hood ?
Modules tend to remove cycles
from the number, until it reaches a positive number that is smaller than the number of the cycle which we call modulo OR
a negative number which we call a reminder
.
However, Using %
operator is time expensive.
To avoid using
%
while getting the same result, we can use the following:
While(a >= n) a -= n;
(when a
is a positive number)While(a < 0) a += n;
(when a
is a negative number)
a = n*q + r
that means r = a - n*q
While q is the integer division of a/n
which means a%n == a - n * Math.toIntExact(a/n)
Which is sufficient when a
is a positive number.
a
is a negative number, we can use (a%n + n) % n
Which will give you module.Case Scenario on Clock:
if it is now 9 O'clock, what time after 4 hours =>
9+4 = 13h =>
13%12=1 while 12 is the cycle number in the clock
What if we need to calculate time before 24
hours (Yesterday) from now which is 9 O'clock
, then:
24(2*12)
=>
Yesterday Means 9-24 = -15h
While the right answer is 9
, to solve this we will use (a%n + n) % n
While a%n == (a - n * Math.toIntExact(a/n))
then -15 - 12 * Math.toIntExact(-15/12) = -3
=> -3 + 12 = 9
=> 9%12
=> 9 - 12 * Math.toIntExact(9/12) = 9
Which is the right answer.
This is the code for the clock Scenario:
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt(); // a = -15
int n = scanner.nextInt(); // cycle = 12
int reminder = a - (n * Math.toIntExact(a / n));
int reminder_plus_n = (reminder + n);
int modulo = reminder_plus_n - (n * Math.toIntExact(reminder_plus_n / n));
System.out.println(modulo); // Answer = 9
}