【题目】
题目描述:
任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=2^2+2+2^0 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=2^10+2^8+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
【思想】
递归,每次递归传入的值是2的次幂,用一个总值保存当前的结果,当总和小于的时候,递归当前2的次幂,递归边界条件是三个直接表示,即2的0次幂=1,2的1次幂=2,2的2次幂=4
当总和等于目标值,结束递归。
【代码】
import java.util.*; public class Main{ private static String coupons(int n){ int sum=0; String res=""; for(int i=15;i>=0;i--){ int temp=(int)Math.pow(2,i); if(sum+temp<n){ sum+=temp; String str=""; if (i == 0) { str = "2(0)"; } else if (i == 1) { str = "2"; } else if (i == 2) { str = "2(2)"; }else{ str = "2("+coupons(i)+")"; } result+=(str+"+"); }else if(sum+temp==n){ sum+=temp; String str=""; if (i == 0) { str = "2(0)"; } else if (i == 1) { str = "2"; } else if (i == 2) { str = "2(2)"; }else{ str = "2("+coupons(i)+")"; } res+=str; break; } } return res; } public static void main(String[] args){ Scanner reader = new Scanner(System.in); int n = reader.nextInt(); System.out.println(coupons(n)); } }
标签:表示,1315,递归,4.2,int,样例,137 From: https://www.cnblogs.com/End1ess/p/17599694.html