수학은 체육과목이라더니 수학문제인것도 어이없는데 그마저도 풀었더니 틀렸다.
#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 |