算法训练 2的次幂表示(java)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lc5801889/article/details/86760976
  • 问题描述

任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
  将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=27+23+2^0
  现在约定幂次用括号来表示,即a^b表示为a(b)
  此时,137可表示为:2(7)+2(3)+2(0)
  进一步:7=22+2+20 (2^1用2表示)
  3=2+2^0
  所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:1315=210+28+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)

  • 提示

用递归实现会比较简单,可以一边递归一边输出

  • 思路
    这道题采用递归嵌套的方法解决,首先将输入的正整数转换成二进制数,进而将高次幂通过递归方式降为0,1,2次幂。
    重点注意输出格式问题,代码原理比较简单,但是需要循环判断末尾二进制数是否为0,末尾为0则不输出“+”号。
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		Digui(n);
		
	}

	private static void Digui(int n) {
		String temp =Integer.toBinaryString(n);
		int j = temp.length()-1;
		boolean flag = true;//用于判断是否到末尾
		for (int i = 0; i <temp.length() ; i++) {
			if(temp.charAt(i)=='1'){
				if(j>2){
					for (int k = i+1; k < temp.length(); k++) {
						if(temp.charAt(k)=='0'){
							flag = true;
						}else{
							flag = false;
							break;
						}
					}
					if(flag){  //如果后面的每个的二进制数都为0则不输出“+”
						System.out.print("2(");
						Digui(j);
						System.out.print(")");
					}else{
						System.out.print("2(");
						Digui(j);
						System.out.print(")+");
					}
				}else if(j==2){		//次幂降为2时不在进行降幂
					if(temp.charAt(temp.length()-2)=='1'||temp.charAt(temp.length()-1)=='1'){
						System.out.print("2(2)+");//后面的每个的二进制数都为0则不输出“+”
					}else{
						System.out.print("2(2)");
					}
				}else if(j==1){
					if(temp.charAt(temp.length()-1)=='1'){//后面的二进制数都为0则不输出“+”
						System.out.print("2+");
					}else{
						System.out.print("2");
					}
				}else if(j==0){
					System.out.print("2(0)");
				}
			}j--;
		}
	}
}

测试数据

猜你喜欢

转载自blog.csdn.net/lc5801889/article/details/86760976
今日推荐