1. 程式人生 > >藍橋杯 ——2的次冪表示

藍橋杯 ——2的次冪表示

問題描述
  任何一個正整數都可以用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)
提示
  用遞迴實現會比較簡單,可以一邊遞迴一邊輸出

思路:
觀察樣例:1315=2^10+2^8+2^5+2+1
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
先找出整數n的最大2次冪k,然後令n=n-2^k,繼續計算n的最大2次冪,直到n=0或n=1為止,此處可以用遞迴實現。另外在遞迴的同時進行列印時需要注意2^2=2(2),2^1=2,2^0=2(0),括號的列印需要條件判斷。

import java.util.Scanner;

public class Test {

    public int calculate(int n) {// 計算整數n的最大2次冪
        int
i = -1; while (Math.pow(2, i) <= n) { i++; } i--; return i; } public void print(int n) { switch (n) { case 0: System.out.print("0");//n=0時,2(0) return; case 1: System.out.print("2");//n=1時,2(1) = 2,括號的顯示與n獨立
return; case 2: System.out.print("2");//n=2時,2(2) return; default: break; } int k = calculate(n); if (k >= 2 || k == 0) {//2(2),2(1),2(0)中,2(1)直接用2替換,不需要新增2(),直接列印 System.out.print("2("); print(k); System.out.print(")"); } else { print(k); } int m = n - (int) Math.pow(2, k); while (m > 0) { int t = calculate(m); System.out.print("+"); if (t >= 2 || t == 0) {//條件判斷的理由同上 System.out.print("2("); print(t); System.out.print(")"); } else { print(t); } m = m - (int) Math.pow(2, t); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); Test t = new Test(); t.print(n); } }

相關推薦

算法訓練 2表示(藍橋C++寫法)

ostream ali font 我們 DC ace 找到 進制 就是 問題描述   任何一個正整數都可以用2進制表示,例如:137的2進制表示為10001001。  將這種2進制表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^

藍橋 演算法訓練 ALGO-95 2表示

演算法訓練 2的次冪表示 時間限制:1.0s 記憶體限制:512.0MB 問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=27+23+2^0   現

藍橋 演算法訓練 2表示

演算法訓練 2的次冪表示 問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下

藍橋訓練:2表示(遞迴)

程式碼:ALGO-95 題目名稱:2的次冪表示 關鍵字: 上傳日期:2014-12-29 資源限制:時間限制:1.0s 記憶體限制:512.0MB 問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。

藍橋 ——2表示

問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^0   現在約定冪次用括號來表示,即a^b表示為a(

藍橋-演算法訓練 2表示

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 提示 用遞迴實現會比較簡單,可以一邊遞迴一邊輸出#include <cstdio> #include <iostream> #include <cstring> #include

藍橋演算法訓練——2表示 (遞迴)

問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3

藍橋 2表示

一遍遞迴一遍輸出#include <iostream> using namespace std; string Binary(int n){ string s=""; while(n){ s+=('0'+n%2); n/=2; } re

2016藍橋假期任務之《2表示

問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^0   現在約定冪次用括號來表示,即a^b表示為a(b)   此時,1

藍橋--演算法訓練 2表示

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 提示 用遞迴實現會比較簡單,可以一邊遞迴一邊輸出 思路:先把輸入的數轉化成二進位制並記錄1出現的次數與位置。使用遞迴求解. 遞迴出口:當1出現的位置為0時輸出2(0). 當1出現的位置為1時輸出2,當1出現的位置為

藍橋 2的n表示

  任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。  將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^0  現在約定冪次用括號來表示,即a^b表示為a(b)  此時,137可表示為:2(7)+2(3)+2(0)  進一步

藍橋 演算法訓練 2表示 java

藍橋杯 演算法訓練 2的次冪表示 java 藍橋杯 演算法訓練 2的次冪表示 java 題目說明 輸入輸出 輸入格式 輸出格式 樣例輸入 樣例輸出 樣例輸入 樣例輸出 提示 思路 程式碼 題目說明   任何一個正整數都可

藍橋——二的表示

問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3+2^0   現在約定冪次用括號來表示,即a^b表示為a(b)   此

2表示 (遞迴)

思路:這遞迴遞的我頭都暈了,先貼個偽遞迴吧 AC程式碼: #include <cstdio> #include <cstring> #include <algor

藍橋—ALGO-12 方分解

mat break 要求 post 括號 std sin using 字符 問題描述  任何一個正整數都可以用2的冪次方表示。例如:  137=27+23+20   同時約定方次用括號來表示,即ab 可表示為a(b)。  由此可知,137可表示為:  2(7)+2(3)+2

關於二進位制的表示

  演算法訓練 2的次冪表示   時間限制:1.0s   記憶體限制:512.0MB      問題描述   任何一個正整數都可以

HashMap 容量為2的原因

我們都知道 hashmap 的底層是一個數組加連結串列的結構,當向其中新增一個元素的時候,需要根據key的hash值,去確定其在陣列中的具體位置。 看原始碼,我們可以發現,確定陣列位置的實現是 i=(n-1)& hash,其中 n 代表陣列的長度,即map的容量。 當n為2的冪

求最接近cap的2(tableSizeFor函式的實現)

不比cap小的2次冪(HashMap中的tableSizeFor函式)// 初始化臨界值的具體實現 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>>

八屆藍橋: 2 標題:跳蚱蜢

下標 != index style img pop names 就是 max 圖所示: 有9只盤子,排成1個圓圈。其中8只盤子內裝著8只蚱蜢,有一個是空盤。我們把這些蚱蜢順時針編號為 1~8每只蚱蜢都可以跳到相鄰的空盤中,也可以再用點力,越過一個相鄰的蚱蜢跳到空盤中。請你計

獲取比某個數大的最小2

shm map ble 最小 size fin jdk1.8 代碼 pac static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n &g