问题描述
任何一个正整数都可以用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;
}