题目描述
输入格式
一行一个正整数n
输出格式
符合约定的额n的0,2表示 (表示中不能有空格)
输入输出设备样例
输入:
1315
输出:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
说明/提示
【数据范围】
对于100%的数据, 1 <= n <= 2*10^4
表达能力不是很好,代码里面补上备注了,这题用到二进制和递归,这边就直接上代码了。
import java.util.Scanner;
public class power_test {
public static void main(String[] args) {
int num = new Scanner(System.in).nextInt();
String s = fun(num);
//输出时去除s两边的括号
System.out.printf(s.substring(1, s.length() - 1));
}
static String fun(int num1) {
//当num为0时,函数返回(0)
if (num1 == 0){return "(0)";}
//当num为1时,函数返回空字符串
if (num1 == 1){return "";}
String s = "";
//将传入的数值转换为对应的二进制字符串
String num = Integer.toBinaryString(num1);
//当sign用于确定当前循环是否为第一次
int sign = 1;
//循环对2()+2()+....+2()中的元素进行赋值
for (int i = 0; i < num.length(); i++) {
//字符串‘1’的ascii的值为49,‘0’的ascii值为48
if ((int)num.charAt(i) == 49 && sign == -1){
//循环的非第一次递归获取2()中()内的元素
s += "+2" +fun(num.length() - i - 1);
}else if ((int)num.charAt(i) == 49 && sign == 1){
//循环的第一次递归获取2()中()内的元素
s += "2" + fun(num.length() - i - 1);
//更改标记
sign = -1;
}
}
//返回值
return "("+s+")";
}
}