https://www.acmicpc.net/problem/17497
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
static long number;
static void input() {
Reader scanner = new Reader();
number = scanner.nextLong();
}
/*
* 두 가지 방법을 이용하여 문제를 해결한다
* 1. N에서부터 0을 만든다
* 2. 비트마스킹을 이용한다
* - N의 2^0 자리의 비트(0번째 비트라 칭하겠다), 2^1 자리의 비트(1번째 비트라 칭하겠다)를 살펴본다
* a. 0번째 비트가 1이라면
* - 0번째 비트가 1이라는 뜻은 홀수라는 이야기이다
* - 홀수일 때는 2를 더하거나 빼는 것으로는 짝수 혹은 0을 만들 수 없다
* - 그러므로 2를 곱해서 비트를 하나 밀어줌으로써 짝수를 만든다
* b. 0번째 비트가 0, 1번째 비트가 1이라면
* - 덧셈 연산 및 뺄셈 연산을 통해 1번째 비트를 0으로 변경할 수 있다
* - 이때 덧셈 연산을 진행한다면 그 이후 자릿수에도 영향을 주기 때문에 뺄셈을 통해 1번째 비트를 0으로 변경한다
* c. 0번째 비트, 1번째 비트 모두 0이라면
* - 나누기 연산을 통해 앞의 비트를 당겨와 나머지 1 비트를 0으로 변경한다
* - 위 과정을 모든 비트가 0이 될 때까지 반복하고, 0이 되었을 때 그때까지 진행한 연산 및 연산 횟수를 출력한다
*/
static void solution() {
Stack<String> operators = new Stack<>();
while (number != 0) {
if ((number & 1) == 1) {
number *= 2;
operators.push("[/]");
} else if ((number & 2) != 0) {
number -= 2;
operators.push("[+]");
} else {
number /= 2;
operators.push("[*]");
}
}
if (operators.size() > 99) {
System.out.println(-1);
} else {
StringBuilder answer = new StringBuilder();
answer.append(operators.size()).append('\n');
while (!operators.isEmpty()) {
answer.append(operators.pop()).append(' ');
}
System.out.println(answer);
}
}
public static void main(String[] args) {
input();
solution();
}
static class Reader {
BufferedReader br;
StringTokenizer st;
public Reader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
long nextLong() {
return Long.parseLong(next());
}
}
}