For each case, the input file contains a positive integer n (n<=20000).
For each case, you should output the exponential form of n an a single line.Note that,there should not be any additional white spaces in the line.
1315
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 15 // n<=20000 则2的14次方<n<2的15次方, n的2进制位低于15位
void pow2(int num) { //所有的数都要分解成最后只剩下 2的0次、2的1次、2的2次
int num2[MAX], length = 0; //num2存储num对应的二进制数
if (num == 0) //0代表2的0次幂
printf("2(0)");
else if (num == 1) //这里的 1代表2的1次幂
printf("2");
else if (num == 2) //2代表2的2次幂
printf("2(2)");
else { //这里处理幂>=3 的幂,将这个幂转化为只剩下 2的0次、2的1次、2的2次
int temp = num, i = 0, j;
do { //计算num的二进制数,存到num2[]里
num2[i] = temp % 2;
temp = temp / 2;
i++;
} while (temp > 0);
length = i;
for (int i = length - 1; i >= 0;i--) { // 从数组的后面往前计算,因为题目要求从二进制的高位往低位输出
if (num2[i] == 1) {
if (i < length - 1)
printf("+"); // 最高位之后,若还要输出,则输出一位就先输出一个加号,再输出这一位的字符
if (i > 2)
printf("2("); //所有大于2的数都要经过再一次的二进制分解,也就是再往小分,那也就需要增加前后括号
pow2(i);
if (i > 2)
printf(")");
}
}
}
}
int main() {
int num;
scanf("%d", &num);
if (num == 0 || num < 0)
printf("0");
else if (num == 1)
printf("2(0)");
else if (num == 2)
printf("2");
else
pow2(num);
return 0;
}