your programing

모듈러스 연산자를 사용할 때 인식

lovepro 2020. 12. 29. 08:05
반응형

모듈러스 연산자를 사용할 때 인식


모듈러스 (%) 연산자가 나눗셈의 나머지를 계산한다는 것을 알고 있습니다. 모듈러스 연산자를 사용해야하는 상황을 어떻게 식별 할 수 있습니까?

모듈러스 연산자를 사용하여 숫자가 짝수인지 홀수인지, 소수인지 합성인지 알 수 있지만 그게 전부입니다. 나는 종종 나머지 측면에서 생각하지 않습니다. 모듈러스 연산자가 유용하다고 확신하며이를 활용하는 방법을 배우고 싶습니다.

모듈러스 연산자를 적용 할 수있는 위치를 식별하는 데 문제가 있습니다. 다양한 프로그래밍 상황에서 문제를보고 "이봐 요! 나머지 부분은 여기서 작동합니다!"라는 것을 깨닫기가 어렵습니다.


경과 된 시간 (초)이 있고이를 시간, 분, 초로 변환한다고 가정 해보십시오.

h = s / 3600;
m = (s / 60) % 60;
s = s % 60;

0 % 3 = 0;
1 % 3 = 1;
2 % 3 = 2;
3 % 3 = 0;

뭘했는지 봤어? 마지막 단계에서 0으로 돌아갔습니다. 다음과 같은 상황에서 사용할 수 있습니다.

  1. N이 M으로 나눌 수 있는지 (예 : 홀수 또는 짝수) 또는 N이 M의 배수인지 확인합니다.

  2. 특정 가치의 한도를 설정합니다. 이 경우 3.

  3. 숫자의 마지막 M 자리를 얻으려면-> N % (10 ^ M).

큰 루프를 통해 진행 표시가 진행되는 막대 등에 사용합니다. 진행률은 루프를 통해 n 번째마다 또는 count % n == 0 인 경우에만보고됩니다.


숫자를 특정 배수로 제한 할 때 사용했습니다.

temp = x - (x % 10); //Restrict x to being a multiple of 10

  • 값을 래핑합니다 (예 : 시계).
  • 대칭 키 알고리즘에 유한 필드를 제공합니다.
  • 비트 연산.

등등.


예. X 바이트의 메시지가 있지만 프로토콜에서 최대 크기는 Y 및 Y <X입니다. 메시지를 패킷으로 분할하는 작은 앱을 작성하면 mod로 실행됩니다. :)


선형 데이터 구조를 행렬 구조로 변환 : 여기서는 a선형 데이터의 인덱스 b이고은 행당 항목 수입니다.

row = a/b
column = a mod b

위의 참고 사항은 단순화 된 논리입니다. a나누기 전에 오프셋 -1이어야하며 결과는 +1이어야합니다.

예 : (4 개씩 3 개 행)

1  2  3  4    
5  6  7  8    
9 10 11 12 

(7 - 1)/4 + 1 = 2

7 is in row 2

(7 - 1) mod 4 + 1 = 3 

7 is in column 3

모듈러스의 또 다른 일반적인 사용 : 장소별로 숫자를 해싱합니다. 년과 월을 6 자리 숫자 195810에 저장하려고한다고 가정합니다. month = 195810 mod 100오른쪽에서 세 번째 숫자는 모두 100으로 나눌 수 있으므로 나머지는이 경우 가장 오른쪽 2 자리가됩니다.이 경우 월은 10입니다. 연도를 추출하려면 195810 / 1001958이됩니다.


내가 최근에 본 한 가지 사용 사례는 숫자를 반전해야 할 때였습니다. 예를 들면 그렇게 123456됩니다 654321.

int number   = 123456;
int reversed = 0;

while ( number > 0 ) {
    # The modulus here retrieves the last digit in the specified number
    # In the first iteration of this loop it's going to be 6, then 5, ...
    # We are multiplying reversed by 10 first, to move the number one decimal place to the left.
    # For example, if we are at the second iteration of this loop, 
    #  reversed gonna be 6, so 6 * 10 + 12345 % 10 => 60 + 5
    reversed = reversed * 10 + number % 10;
    number = number / 10;
}

소수 계산


나누기가 있고 십진수 이외의 나머지를 표현하고 싶을 때마다 mod 연산자가 적합합니다. 떠오르는 것은 일반적으로 나머지를 가지고 사람이 읽을 수있는 것을하고 싶을 때입니다. 버킷에 넣을 수있는 항목 수를 나열하고 "5 개 남음"이라고 말하는 것이 좋습니다.

또한 반올림 오류가 발생할 수있는 상황에 처한 경우 모듈로 나누기가 좋습니다. 예를 들어, 3으로 자주 나누는 경우 .33333을 나머지로 전달하고 싶지 않습니다. 나머지와 제수 (즉, 분수)를 전달하는 것이 적절합니다.


@jweyrich가 말했듯이 값을 래핑합니다. 한정된 목록이 있고 모든 시리즈가 다르기를 원하는 차트 시리즈와 같은 일부 UI 요소에 대한 고정 된 색상 목록과 같이 루프에서 반복하고 싶을 때 모드가 매우 편리하다는 것을 알았습니다. 가능하지만 색상이 떨어지면 처음부터 다시 시작합니다. 예를 들어 패턴과 함께 사용할 수도 있습니다. 그래서 두 번째로 빨간색이 나오면 점선으로 표시됩니다. 세 번째, 점선 등-그러나 mod는 빨강, 녹색, 파랑, 빨강, 녹색, 파랑, 영원히 얻는 데 사용됩니다.


Modulus는 어떤 미친 이유로 정수 나눗셈을하고 소수를 얻어야하고 정수를 소수 나눗셈을 지원하는 숫자로 변환 할 수 없거나 소수 대신 분수를 반환해야하는 경우에도 매우 유용합니다. .

%모듈러스 연산자 로 사용하겠습니다.

예를 들면

2/4 = 0

이거 어디서

2/4 = 0 and 2 % 4 = 2

그래서 당신은 정말 미쳤을 수 있습니다. 그리고 사용자가 분자와 제수를 입력하고 그 결과를 정수로 보여주고 분수로 보여주고 싶다고합시다.

whole Number = numerator/divisor
fractionNumerator = numerator % divisor
fractionDenominator = divisor

모듈러스 나눗셈이 유용한 또 다른 경우는 숫자를 늘리거나 줄이면서 특정 범위의 숫자를 포함하고 싶지만 맨 위 또는 맨 아래에 도달 할 때 멈추고 싶지 않은 경우입니다. 목록의 맨 아래 또는 맨 위로 각각 반복하려고합니다.

배열을 반복하는 함수를 상상해보십시오.

Function increase Or Decrease(variable As Integer) As Void
    n = (n + variable) % (listString.maxIndex + 1)  
    Print listString[n]
End Function

n = (n + 변수) % (listString.maxIndex + 1) 인 이유는 최대 인덱스를 계산할 수 있기 때문입니다.

Those are just a few of the things that I have had to use modulus for in my programming of not just desktop applications, but in robotics and simulation environments.


The modulo can be useful to convert and split total minutes to "hours and minutes":

hours = minutes / 60

minutes_left = minutes % 60

In the hours bit we need to strip the decimal portion and that will depend on the language you are using.

We can then rearrange the output accordingly.


There are many instances where it is useful.

If you need to restrict a number to be within a certain range you can use mod. For example, to generate a random number between 0 and 99 you might say:

num = MyRandFunction() % 100;

  • Computing the greatest common divisor
  • Determining if a number is a palindrome
  • Determining if a number consists of only ...
  • Determining how many ... a number consists of...

My favorite use is for iteration.

Say you have a counter you are incrementing and want to then grab from a known list a corresponding items, but you only have n items to choose from and you want to repeat a cycle.

var indexFromB = (counter-1)%n+1;

Results (counter=indexFromB) given n=3:

`1=1`
`2=2`
`3=3`
`4=1`
`5=2`
`6=3`
...

It's an easy way to tell if a number is even or odd. Just do # mod 2, if it is 0 it is even, 1 it is odd.


Best use of modulus operator I have seen so for is to check if the Array we have is a rotated version of original array.

A = [1,2,3,4,5,6] B = [5,6,1,2,3,4]

Now how to check if B is rotated version of A ?

Step 1: If A's length is not same as B's length then for sure its not a rotated version.

Step 2: Check the index of first element of A in B. Here first element of A is 1. And its index in B is 2(assuming your programming language has zero based index). lets store that index in variable "Key"

Step 3: Now how to check that if B is rotated version of A how ??

This is where modulus function rocks :

for (int i = 0; i< A.length; i++)
{

// here modulus function would check the proper order. Key here is 2 which we recieved from Step 2
   int j = [Key+i]%A.length;

   if (A[i] != B[j])
   {
     return false;
   }
}

return true;

ReferenceURL : https://stackoverflow.com/questions/2609315/recognizing-when-to-use-the-modulus-operator

반응형