1.题目描述:
任何一个正整数都可以用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)
2.代码实现:——递归实现——Java 语言
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
System.out.println(fun(sc.nextInt()));
}
private static String fun(int n){
int sum=0;
String result="";
for(int i=15;i>=0;i--){
int temp=(int)Math.pow(2,i);
if(sum+temp<n){
sum+=temp;
String tempStr;
if (i == 0) {
tempStr = "2(0)";
} else if (i == 1) {
tempStr = "2";
} else if (i == 2) {
tempStr = "2(2)";
}else{
tempStr = "2("+fun(i)+")";
}
result+=(tempStr+"+");
}else if(sum+temp==n){
sum+=temp;
String tempStr;
if (i == 0) {
tempStr = "2(0)";
} else if (i == 1) {
tempStr = "2";
} else if (i == 2) {
tempStr = "2(2)";
}else{
tempStr = "2("+fun(i)+")";
}
result+=tempStr;
break;
}
}
return result;
}
}
代码实现——C语言
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void fun(int n)
{
int s = 1;//2的次方的值
int t = 0;//指数
if (n == 1)//若是1则直接输出
{
printf("2(0)");
return;
}
if (n == 2)//若是2则直接输出
{
printf("2");
return;
}
while (s <= n)//通过不断s*2找出大于n时的指数
{
s = s * 2;
t++;
}
t = t - 1;
if (n == s / 2) //n刚好为2的某次方的值
{
printf("2(");
fun(t); //进一步计算指数
printf(")");
}
else //计算剩下的值
{
if (s / 2 == 2)
{
printf("2");
printf("+");
fun(n - s / 2);
}
else
{
printf("2(");
fun(t);
printf(")+");
fun(n - s / 2);
}
}
}
int main()
{
int n, x = 0;
while (x == 0)
{
printf("请输入整数:");
scanf("%d", &n);
fun(n);
printf("是否继续?(0/1)");
scanf("%d", &x);
}
return 0;
}