본문 바로가기

백준

15894 수학은 체육과목 입니다

수학은 체육과목이라더니 수학문제인것도 어이없는데 그마저도 풀었더니 틀렸다.

 

#include <iostream>

int main() {
    int a;
    scanf("%d", &a);
    printf("%d",4*a);
}

 

저 4n이 틀렸나 해서 다시 확인해봤더니 아니었고 알고보니 int형으로 입력을 받으니 오버플로우가 일어났다.

최대 입력값인 10^9를 입력하면 오버플로우가 발생한다,,

그래서 어찌하지 하다가 문자열은 크기 제한이 없어서 문자열로 받아야 겠다고 생각했다. 

 

#include <iostream>
#include <string>
using namespace std;

int main() {
    string num;
    int cash = 0, tmp;
    cin >> num;
    
    for(int i = num.length() - 1; i >= 0; i--){
        tmp = (num[i] - '0') * 4 + cash;
        num[i] = (tmp % 10) + '0';
        cash = tmp / 10;
    }
    if(cash != 0)
        cout << cash;
    cout << num;
}

char a[12] 이런식으로 C언어의 문자열로 받을까 하다 기왕 C++로 코딩하는거 string 클래스를 찾아서 써봤다. 

그리고 클래스라 그런지 scanf랑 printf도 안 됐다,, 어쩔 수 없이 cin이랑 cout을 썼긴 한데 음.. 너무 낯설다.

 

계산은 이런 방식으로 했다. 오버플로우가 나면 안 되기 때문에 전체를 다 변환시킬 수는 없고 하나씩 불러와서 계산을 해야 했다. (num[i] - '0')은 문자열을 숫자로 바꾸기 위한 부분이다. 이렇게 하면 정수로 변환시킬 수 있다. (자세한 건 아스키 코드 참고).

문자를 꺼내와서 4를 곱한 다음 뒤의 숫자는 그 자리 배열에 저장하고 앞의 수는 다음 배열을 계산할 때 써야하므로 저장한다. 이 수를 지칭하는 용어가 있었는데 이건 잘 기억이 안 난다. 올림수였나.. 

마지막으로 올림수가 있으면 출력해주고 없으면 출력하지 않는다. 

 

 

#include <iostream>

using i64 = long long;

int main() {
	i64 n;
    scanf("%lld", &n);
	printf("%lld", 4 * n);
    
    return 0;
}

나는 이렇게 풀었는데 사실 long long을 쓰면 됐었다! int는 4byte지만 long long은 8byte라 10^18까지 커버가능하다. unsigned long long이면 10^19까지 가능하다! 앞으로 입력값을 잘 보고 크다 싶으면 int값을 써야겠다. 

그리고 보통 long long은 길기 때문에 저렇게 축약어를 정의해놓고 쓴다고 한다. 서식문자는 %lld 엘엘디

'백준' 카테고리의 다른 글

10039 평균점수  (0) 2019.09.29
8393 합  (0) 2019.09.29
2588 곱셈  (0) 2019.09.29
17256 달달함이 넘쳐흘러  (0) 2019.09.29
14652 나는 행복합니다~  (0) 2019.09.29