问题描述
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
同时约定方次用括号来表示,即ab 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 22+2+20 (21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210 +28 +25 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
输入包含一个正整数N(N<=20000),为要求分解的整数。
输出格式
程序输出包含一行字符串,为符合约定的n的0,2表示(在表示中不能有空格)
思路都在注释中
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner read = new Scanner(System.in);
int n = read.nextInt();
read.close();
f(n);
}
public static void f(int n)
{
if(n==0)
{
System.out.print("0");
return;
}
//首先我们创建一个字符数组用来存放该数字的二进制
char []ch = Integer.toBinaryString(n).toCharArray();
//看题目可以知道第一个数字前面是没有加号的,所以我们创建一个boolean来标记是不是第一个数字
boolean one = true;
for(int i=0;i<ch.length;i++)
{
if(ch[i]=='1')//如果不为零
{
if(one)//并且使第一个数字
{
if(ch.length-i-1 == 1)//如果是2的1次方,直接输出2
{
System.out.print("2");
}
else
{
//如果不是1次方
System.out.print("2(");
f(ch.length-1-i);//这个ch.length-1-i次方需要进一步分解,所以递归
System.out.print(")");
}
one = false;//后面的就要加加号了
}
else
{
if(ch.length-i-1 == 1)//如果是2的1次方,直接输出2
{
System.out.print("+2");
}
else
{
//如果不是1次方
System.out.print("+2(");
f(ch.length-1-i);//这个ch.length-1-i次方需要进一步分解,所以递归
System.out.print(")");
}
}
}
}
}
}