[백준/C] 1009번 분산처리
[백준/C] 1009번 분산처리
문제
- 재용이는 최신 컴퓨터 10대를 가지고 있다. 어느 날 재용이는 많은 데이터를 처리해야 될 일이 생겨서 각 컴퓨터에 1번부터 10번까지의 번호를 부여하고, 10대의 컴퓨터가 다으모가 같은 방법으로 데이터들을 처리하기로 하였다.
- 1번 데이터는 1번 컴퓨터, 2번 데이터는 2번 컴퓨터, 3번 데이터는 3번 컴퓨터, …,
- 10번 데이터는 10번 컴퓨터, 11번 데이터는 11번 컴퓨터, 12번 데이터는 2번 컴퓨터, …
- 총 데이터의 갯수는 항상 a^b개의 형태로 주어진다. 재용이는 문득 마지막 데이터가 처리될 컴퓨터의 번호가 궁금해졌다. 이를 수행해주는 프로그램을 작성하라.
입력
- 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다.
- 그 다음 줄부터 각각의 테스트 케이스에 대해 정수 a와 b가 주어진다.
- (1 ≤ a < 100, 1 ≤ b < 1,000,000)
출력
- 각 테스트 케이스에 대해 마지막 데이터가 처리되는 컴퓨터의 번호를 출력한다.
제한
예제 입력
1 2 3 4 5 6
5 2 1 6 3 7 6 2 7 100 9 635
출력
1 2 3 4 5
1 7 6 1 9
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h> //거듭제곱 pow()함수 사용을 위해서
int main() {
int T; //테스트 케이스의 개수
int a, b; //정수 a, b
int total_data = 0;
scanf("%d", &T);
for(int i = 0; i < T; i++) {
scanf("%d %d", &a, &b);
total_data = pow(a, b); //데이터의 총 개수는 항상 a^b다.
int last_com = total_data % 10;
if(last_com == 0) {
last_com = 10;
} else {
}
printf("%d\n", last_com);
}
return 0;
}
이것이 처음 내가 짠 코드였다.
처음에 1 6, 3 7, 6 2에 대한 입력 값에 출력은 정상적으로 1, 7, 6으로 나왔다.
하지만 7 100, 9 635에서 문제가 발생하였다.
나는 pow()함수가 부동소수점(double)을 반환하기 때문에 큰 수에 대해서 문제를 일으키고 있었다.
for문으로 수정하였고 이 또한 해결책이 되지 못했다.
다시 한 번 내가 짠 코드를 확인해보니,
1
total_data *= a;
이 부분에서 오버플로우가 발생하여 이상한 값으로 출력이 되고 있었다.
코드를 개선하기 위해서 for문 안에서 %10도 같이 처리를 해줬다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int T; //테스트 케이스의 개수
int a, b; //정수 a, b
scanf("%d", &T);
for(int i = 0; i < T; i++) {
scanf("%d %d", &a, &b);
int last_comp = 1;
for(int j = 0; j < b; j++){
last_comp = (last_comp * a) % 10;
}
if(last_comp == 0) {
last_comp = 10;
}
printf("%d\n", last_comp);
}
return 0;
}
문제 링크
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.