小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币
魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。
输入包括一行,包括一个正整数n(1 ≤ n ≤ 10^9),表示小易需要的魔法币数量。
输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符'1'和'2'。
10
122
这是一个变相的二进制计算问题。
数值 :1 2 3 4 5 6 7
机器序列:1 2 11 12 21 22 111
0是机器1,1是机器2,机器序列表示为二进制:
二进制 :0 1 00 01 10 11 000
高位补1:10 11 100 101 110 111 1000
新数值 :2 3 4 5 6 7 8
新数值=数值+1,新数值直接使用二进制位来判断;最高位1用于结束判断。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
System.out.println(magic(num));
}
private static StringBuilder magic(int num) {
num++;
StringBuilder builder = new StringBuilder();
while (num > 1) {
if ((num & 1) > 0) {
builder.insert(0, "2");
} else {
builder.insert(0, "1");
}
num = num >> 1;
}
return builder;
}
}
import java.util.Scanner;
public class Main {
private static String numstr = "";
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
computer(num);
print();
}
public static int fun1(int n) {
return (n - 1) % 2;
}
public static int fun2(int n) {
return (n - 2) % 2;
}
public static int computer(int m) {
int n = 0;
while (m > 0) {
n = fun1(m);
if (n == 0) {
numstr = numstr + 1 + ",";
m = (m - 1) / 2;
m = computer(m);
} else {
n = fun2(m);
if (n == 0) {
numstr = numstr + 2 + ",";
m = (m - 2) / 2;
m = computer(m);
}
}
}
return m;
}
public static void print() {
String[] str = numstr.split(",");
for (int i = str.length - 1; i >= 0; i--) {
System.out.print(str[i]);
}
}
}
package demo;
import java.util.ArrayList;
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) {
//用ArrayList存储输出的结果
ArrayList<Integer> list = new ArrayList<>(100);
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//用反推的思路,从后向前求解,最后将list中的值反向输出
//当 n 不等于 0 时,一直循环下去
while (n != 0){
if ( (n-1)%2 == 0 ){ //(n-1)%2 == 0说明上一次用的是 1 号机器
list.add(1); //将值存入 list 中
n = (n-1)/2; //更新 n 的值
} else{ //否则,说明上一次用的是 2 号机器
list.add(2); //将值存入 list 中
n = (n-2)/2; //更新 n 的值
}
}
//反向输出list中的值
for (int i = list.size()-1;i>= 0;i--)
System.out.print(list.get(i));
}
}
import java.util.Scanner;
public class Main {
/** * @param args */ public static void main(String[] args) { //输入需要的魔法币数 Scanner in = new Scanner(System.in); int n = in.nextInt(); StringBuffer sb = new StringBuffer(); while (n >= 0) { if (n == 0) { System.out.println(sb.reverse().toString()); break; } else if (n > 0) { if (n % 2 == 0) { // 偶数 n = (n - 2) / 2; sb.append("2"); } else { // 奇数 n = (n - 1) / 2; sb.append("1"); } } else { System.out.println("无法获得所需魔法币!"); } } /*String str = ""; while (n >= 0) { if (n == 0) { System.out.println("依次投入机器顺序:" + str); break; } else if (n > 0) { if (n % 2 == 0) { // 偶数 n = (n - 2) / 2; str = "2" + str; } else { // 奇数 n = (n - 1) / 2; str = "1" + str; } } else { System.out.println("无法获得所需魔法币!"); } }*/ }
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception{
Scanner scanner =new Scanner(System.in);
intnum = Integer.parseInt(scanner.nextLine());
String result = analize(num);
System.out.println(result);
}
/**
dfs
*/
publicstaticString analize(intn)throwsException {
String str ="";
while(n >0){
if(n %2==0){
str +=2;
n = (n-2)/2;
}else{
str +=1;
n = (n-1)/2;
}
}
returnnewStringBuffer(str).reverse().toString();
}
}