C 언어 나머지 - c eon-eo nameoji

IT/C C++

[C/C++] 정수, 실수 나머지 구하기

Half Mooon 2022. 5. 20. 10:41

[C/C++] 정수, 실수 나머지 구하기

C 언어 나머지 - c eon-eo nameoji

1. 정수 나머지 구하기

→ a % b (a 나누기 b의 나머지를 계산)

예)

#include <stdio.h>

int main()
{
    printf("%d\n", 1 % 3);    // 1: 1을 3으로 나누면 몫은 0 나머지는 1
    printf("%d\n", 2 % 3);    // 2: 2를 3으로 나누면 몫은 0 나머지는 2
    printf("%d\n", 3 % 3);    // 0: 3을 3으로 나누면 몫은 1 나머지는 0
    printf("%d\n", 4 % 3);    // 1: 4를 3으로 나누면 몫은 1 나머지는 1
    printf("%d\n", 5 % 3);    // 2: 5를 3으로 나누면 몫은 1 나머지는 2
    printf("%d\n", 6 % 3);    // 0: 6을 3으로 나누면 몫은 2 나머지는 0

    return 0;
}
1
2
0
1
2
0

2. 실수 나머지 구하기

필요 헤더파일 : <math.h>

→ double 자료형 : fmod(x, y)
→ float 자료형 :  fmodf(x, y)

→ long double 자료형 : fmodl(x, y)

자료형 차이는 아래 글 참고

[C/C++] 자료형의 크기 및 표현 범위

예)

#include <stdio.h>
#include <math.h>    // fmod 함수가 선언된 헤더 파일

int main()
{
    // 실수의 나머지 연산은 fmod, fmodf, fmodl 함수를 사용

    double num1 = 10.843;
    double num2 = 3.79;
    printf("%f\n", fmod(num1, num2));    // 3.263000

    float num3 = 10.843f;
    float num4 = 3.79f;
    printf("%f\n", fmodf(num3, num4));    // 3.263000

    long double num5 = 10.843l;
    long double num6 = 3.79l;
    printf("%Lf\n", fmodl(num5, num6));    // 3.263000

    return 0;
}
3.263000
3.263000
3.263000

ET의 공부/C언어

[C언어] 몫과 나머지룰 계산하는 프로그램

이티의 골방 2020. 12. 12. 21:34

몫과 나머지룰 계산하는 프로그램입니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <stdio.h>

int main() {

int dividend, divisor, quotient, remainder;

printf("피제수 입력: ");

scanf("%d"&dividend);

printf("제수 입력: ");

scanf("%d"&divisor);

quotient = dividend / divisor;

remainder = dividend % divisor;

printf("몫 = %d\n", quotient);

printf("나머지 = %d\n", remainder);

return 0;

}

C 언어 나머지 - c eon-eo nameoji

몫은 나누기 연산자(/)로 계산을 하고 quotient = dividend / divisor;

나머지는 모듈로 연산자(%)로 계산을 합니다. remainder = dividend % divisor;

정보처리기사/실기

[C언어] 몫과 나머지 구하기. 정수를 실수로 형변환 하기.

7$ 2020. 2. 8. 18:04

#include<stdio.h>
int main() {

	int a, b;
	int na1, na2, na3;
	double mok1, mok2;

    a = 13;
    b = 2;

	na1 = a - (a / b) * b; // 나머지 구하기

	mok1 = a / b;
    mok2 = (float)a / b;
// C에서 몫은 정수로 반환되므로 실수로 출력하기 위해서는 형변환 필요
    
    na2 = a - mok1 * b; // 몫(mok1)을 이용한 나머지 구하기 2
    
    na3 = a % b; //C언어에는 나머지 연산자가 존재함.
		
	printf("나누기 연산 결과 : 몫 %.2f \n", mok1); //몫은 정수가 나온다.
	printf("나누기 연산 결과 : 몫 %.2f \n", mok2); //형변환을 통해 실수까지 출력
	printf("나머지1 연산 결과 : %d \n", na1 ); // 1 
	printf("나머지2 연산 결과 : %d \n", na2 ); // 1
	printf("나머지3 연산 결과 : %d \n", na3 ); // 1

	return 0;
}

실행 결과

C 언어 나머지 - c eon-eo nameoji

우리가 통상 사용하고 있는 나머지 연산자 (%) 에 대한 짧은 이야기를 해 보겠다.

나머지 연산자는 얼핏 보면 나눗셈 연산자 (/) 와 더불어 정수의 몫과 나머지를 구하는
데에 사용되기도 한다. 그런데 다음의 경우를 비교해 보자.

[예 1]  5 /  2
[예 2] -5 / -2
[예 3]  5 / -2
[예 4] -5 /  2

[예 1]의 답은 당연히 2 이다. 정수에서는 소수점 이하는 버리기 때문이다. 또한 [예 2], [예 3] [예 4] 의 답도 각각 2, -2, -2 이다. (초등학교때 배웠던 양수와 음수의 곱셈과 나눗셈 법칙과 같다.)

그렇다면 다음의 예는 어떨까?

[예 5]  5 %  2
[예 6] -5 % -2

[예 7]  5 % -2

[예 8] -5 %  2

실제로 결과를 보면 알겠지만 결과는 각각 1, -1, 1, -1 로 계산되어 나온다. 이렇게 나오는 이유를 설명하겠다.

C 언어의 % 연산자에서 음수 처리는 다음과 같이 정의되어 있다.

X % Y 를 연산할 때 그 연산 결과의 부호는 X 의 부호를 따라간다. 즉 Y의 부호는 무시되며 오직 X가 양수이면 결과는 양수, 음수이면 결과는 음수가 된다. 

쉽게 말하면 [예 5] ~ [예 8]의 결과는, 일단 부호가 모두 양수라 가정하고 계산을 한 후 앞의 수의 부호를 붙인다는 뜻이다.

여기서 한 가지 고찰을 해 보자. 얼핏 보기에 저렇게 정의되는 나머지 연산이 별 것 아니라 느껴지겠지만, 우리가 나머지 연산을 사용하여 구현하는 것 중 일정 주기의 offset 을 구하는 등의 다음과 같은 경우가 있을 수 있겠다. 예를 들어 앞의 수가 차례로 증가 혹은 감소할 때마다 0, 1, 2, 3 의 번호를 주기적으로 부여하는 경우이다.

...

int i;

for( i=100; i>0; i-- )

{

printf("번호 %d 는 %d 조 입니다.\n", i, i%4);

}

...

기대하는 것은 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, ... 식으로 주기적으로 조를 정해주는 것인데, 만일 i 가 0보다 작은 음수로 들어가게 되면, 즉

...

int i;

for( i=50; i>=-50; i-- )

{

printf("번호 %d 는 %d 조 입니다.\n", i, i%4);

}

...

이런 경우에는 양수에서 음수로 바뀌는 부분에서 기대하는 것 처럼 조를 정해주지 않는다. 

즉, 결과가 다음과 같이 나오게 된다. 

... 3, 2, 1, 0, 3, 2, 1, 0, -1, -2, -3, 0, -1, -2, -3 ...

이런 경우는, 결과가 음수일 경우 4를 더하는 등의 방법 등으로써 해결하는 구문이 추가로

요구된다.

^^

즉, 요점은 이렇다.

연산자 자체의 기능만을 설명한 것을 본다면 어렵지 않고 별로 중요하지 않은 것처럼 보이지만, 실제로 이를 응용하여 실전에서 사용하게 될 경우에는 자신도 몰랐던 예상치 못한 결과가 나올 수도 있다는 것을 항상 염두해야 한다는 것이다.

이것이 올바르고 효과적인 디버깅 자세의 시작이 아닐까 한다.

-----------------------

또하나 (중요한 이야기를) 추가하면...

나머지 연산은 실수형에선 동작하지 않는다는 것이다. 즉

  5 % 2

의 값은 1 로 제대로 나오지만

  5.0 % 2.0
  5 % 2.0
  5.0 % 2

등은 컴파일이 되지 않는다는 것을 추가로 알아두자.