本题使用位运算求解。
#include <cstdio>
void p(int n)//难点
{
int i;
int flag = 0;
switch (n) //也可以写几个if和else代替
{
case 0 : printf("2(0)"); break;
case 1 : printf("2"); break;
default :
for (i=14; i>=0; i--)
if (n&((~((~0)<<1))<<i)) //位运算精华
{
if (flag) printf("+"); //很关键,括号内部已经有一个表达式才能加上+号
else flag++;
if (i!=1 && i!=0)
{
printf("2(");
p(i);
printf(")");
}
else
p(i);
}
break;
}
return;
}
int main()
{
int n; //特别简单
scanf("%d", &n);
p(n);
return 0;
}
如果不用位运算,大规模数据(本题不存在)会超时
如果还想更快,可参照洛谷日报第26期:GCC自带位运算系列函数