티스토리 뷰
생각을 결국 떠올리지 못한 문제다!!
한번 2진수로 생각을 해보자
N -> 0까지 갈 예정이다
그럼 내가 0번째 비트가 1이라면 사라지게 할 방법이 없다
그래서 뒤로 한칸 밀어버려야한다(곱하기)
만약 1번째 비트가 1이라면 결국 2라는 값이 포함된다는 말이고
2를 빼면 된다는 말이다(빼기)
만약 0,1비트가 다 0이면 계속 앞으로 땡겨오자(나누기)
그럼 결론적으로 10^13 => 2^45승 정도의 비트를 이런식으로 다 처리하면 된다
N부터 거꾸로 보기때문에 반대로 연산자를 담아주자
0번째 비트가 1인경우,0인경우를 다 생각해보면 어떻게해도 99번을 넘지 않는다
신기하고 쉬워보이지만 나에게는 처음에 어려운 문제였따..!!
소스코드
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
|
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define ll long long
ll n;
vector<char> vt;
int main(){
scanf(" %lld",&n);
while(n){
if(n&1) {
vt.push_back('/'); n*=2;
}
else if(n&2){
vt.push_back('+'); n-=2;
}
else {
vt.push_back('*'); n/=2;
}
}
if(vt.size() >99) puts("-1");
else {
printf("%d\n",(int)vt.size());
for(int i=(int)vt.size()-1; i>=0;i--) printf("[%c] ",vt[i]);
}
}
|
'알고리즘 > BOJ' 카테고리의 다른 글
[백준] 17499 수열과 시프트 쿼리 (0) | 2019.11.08 |
---|---|
[백준] 17498 폴짝 게임 (0) | 2019.11.08 |
[백준] 16438 원숭이 스포츠 (0) | 2019.09.20 |
[백준] 16441 아기돼지와 늑대 (0) | 2019.09.20 |
[백준] 16440 제이크와 케이크 (0) | 2019.09.20 |
댓글