: solved.ac - Bronze 1

 

https://www.acmicpc.net/problem/1834

 

1834번: 나머지와 몫이 같은 수

N으로 나누었을 때 나머지와 몫이 같은 모든 자연수의 합을 구하는 프로그램을 작성하시오. 예를 들어 N=3일 때, 나머지와 몫이 모두 같은 자연수는 4와 8 두 개가 있으므로, 그 합은 12이다.

www.acmicpc.net

 

 

예제 입력 1

3

 

예제 출력 1

12

 

예제 입력 2

2000000

 

예제 출력 2

3999999999999000000

 

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	long long total = 0;
	int n;
	scanf("%ld", &n);

	for (long long i = 0; i < n; i++) {
		total += (n * i) + i;
	}
	printf("%lld", total);
	return 0;
}

 


해설

: 수학적 원리를 이용한다.

정수의 나누기에서 (나누는 수 * ) + 나머지 = 나눠지는 수 임을 이용한다.

여기서 같아야 하는 것은 몫과 나머지이고, 나머지는 반드시 나누는 수보다 작아야 하므로

1부터 (나누는 수-1)까지의 정수를 위 식의 몫과 나머지에 대입하여

계산된 피젯수를 하나의 변수에 합산한다.

 

	long long total = 0;
	int n;
	scanf("%ld", &n);

	for (long long i = 0; i < n; i++) {
    		total += (n * i) + i;
	}

 

단 이 문제에서 주의해야 하는 부분이 있다면 나누는 수가 200만까지 갈 수 있다는 것이다.

이 경우 합계를 저장하는 변수 total은 (200만*1 +1) 부터 (200만 * 199만9999 + 19만9999)의 수까지를

모두 합한 값을 담아야 하므로, long long int (unsigned일 필요는 없다) 형의 변수를 사용해야 함은 자명하다.

 

다만 total 변수에 합산하기 전의 우변의 식도 (200만 * 199만9999 + 19만9999) 만큼은 담아낼 수 있어야 하기 때문에

여기에서 오버플로우가 일어나서는 안 된다.

여러 번 변수의 형이나 순서 등을 바꿔 가며 실험해본 결과 for문의 변수 i도 long long 형이어야 함을 알아냈다.

(long 형도 안 된다. long long이어야 한다.)(n의 변수형은 무관하다.)

위와 같이 변수 자료형을 사용해 주면 문제없이 계산하고 결과값을 도출해낼 수 있다.

'C언어 > BAEKJOON' 카테고리의 다른 글

[백준] 1157. 단어 공부  (0) 2022.07.13
[백준] 2755. 이번학기 평점은 몇점?  (0) 2022.07.06
[백준] 2164. 카드2  (0) 2022.06.25
[백준] 1929. 소수 구하기  (0) 2022.06.25
[백준] 1427. 소트인사이드  (0) 2022.06.25

+ Recent posts