위 문제는 기말고사가 끝난 뒤 선배와의 약속 때문에 풀게 되었다.
a^b을 변수에 대입하려고 했더니 오버플로우 오류가 생겼다. 오버플로우란 메모리 용량을 넘어선 값이 들어가 생기는 오류이다. 그래서 다른 방법인 규칙을 찾아 코딩하게 되었다. 약간 하드코딩의 느낌이 나서 맞추고도 완전 기쁘지는 않았다.
아래는 내 코드이다.
#include <stdio.h> int main() { int four[4][4] = { { 6,8,4,2 }, {1,3,9,7}, { 6,2,4,8}, {1,7,9,3} }; //a = 8 / 3 / 2 / 7(나머지가 0,1,2,3인 순서) int two[2][2] = { {6,4}, {1,9} }; //a = 4 / 9(나머지 0,1) int *result = NULL; int i, T, a, b, first, column, row; while (scanf("%d", &T) != 1); result = (int*)malloc(sizeof(int)*T); for (i = 0; i < T; i++) { row = 0, column = 0, first = 0; while (scanf("%d %d", &a, &b) != 2); first = a % 10; if (first == 1 || first == 5 || first == 6) result[i] = first; else if (first == 0) result[i] = 10; else if (first == 4 || first == 9) { row = first % 4; column = b % 2; result[i] = two[row][column]; } else if (first == 3) { column = b % 4; result[i] = four[1][column]; } else { row = first % 4; column = b % 4; result[i] = four[row][column]; } } for (i = 0; i < T; i++) printf("%d\n", result[i]); free(result); return 0; }
나누었을 때 나머지의 규칙을 찾아 대입하였다. 일단 내 힘으로 완성을 하고 친구의 코드를 봤다. 친구의 코드에서 내가 막혔던 오버플로우 오류 부분의 해결 방법을 보았다. 그래서 그 부분만 고쳐 다시 제출해서 맞추고 잘 수 있었다.
아래가 그 코드이다.
#include <stdio.h> #include <stdlib.h> int main() { int *result; int i, j, t, a, b, num; while(scanf("%d", &t) != 1); result = (int*)malloc(sizeof(int)*t); for(i=0; i<t; i++) { num = 1, a = 0, b = 0; while(scanf("%d %d", &a, &b) != 2); for(j=0; j<b; j++) { num*=a; if(num>10) num%=10; } if(num == 0) num = 10; result[i] = num; } for(i=0; i<t; i++) printf("%d\n", result[i]); free(result); return 0; }
변수에 a^b를 다 계산해서 대입하지 않고 num이 10보다 커지면 바로 10으로 나눈 나머지를 대입해서 오버 플로우 문제를 해결할 수 있었다.
+) 어떤 사람이 코드가 지저분하다고 했다. 나중에 고쳐야겠다.
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[백준] 1010 다리놓기 (0) | 2017.06.27 |
---|