蓝桥杯——算法训练 幂方分解(vip)

问题描述
  任何一个正整数都可以用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表示(在表示中不能有空格)

JAVA

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int N = input.nextInt();// N<=20000
		if (N >= 2)
			print(N, 1);
		else if (N == 1)
			print(N, 0);
	}

	public static void print(int n, int k) {
		if (Math.pow(2, k) != n && Math.pow(2, k + 1) > n) {
			if (k == 1) {
				System.out.print("2" + "+");
			} else {
				System.out.print("2(");
				if (k != 2 && k != 0)
					if (k > 2)
						print(k, 1);
					else if (k > 1)
						print(k, 0);
				if (k == 2)
					System.out.print(k + ")" + "+");
				else
					System.out.print(")" + "+");
			}
			n = (int) (n - Math.pow(2, k));
			if (n >= 2)
				print(n, 1);
			else if (n == 1)
				print(n, 0);
		} else if (Math.pow(2, k) == n) {
			if (k == 1) {
				System.out.print("2");
			} else if (k != 2 && k != 0) {
				System.out.print("2(");
				print(k, 1);
				System.out.print(")");
			} else {
				System.out.print("2(" + k + ")");
			}
		} else {
			print(n, k + 1);
		}
	}
}

C/C++

#include <cstdio>
#include <iostream>
using namespace std;

void kuye(int n){
	if (n == 0){
		cout << 0;
		return;
	}
	int count = 0;
	for (int i = 31; i >= 0; --i){
		if (n & (1 << i)){
			if (count++)cout << "+";
			if (i == 1)cout << 2;
			else{
				cout << 2 << "(";
				kuye(i);
				cout << ")";
			}
		}
	}
}
int main(int argc, char const *argv[]){
	int N;
	cin >> N;
	kuye(N);
	cout << endl;
	return 0;
}

posted @ 2014-12-09 20:56:00 kuye 阅读(6545) 评论(0)
发表评论
昵称
邮箱
网址