样例输入:
402
样例输出:
2(8)+2(7)+2(4)+2
要求:幂不能重复,如:139=26+26+23+21+20(出现了2个6次方)
参考 C 代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int n; scanf("%d",&n);
int a[100]; // 存储每个指数幂
int i = 0;
int exp = 0;
int num = n;
while (num) // 只要我num还有一口气就继续循环
{
exp = 0; // 每次循环都要初始化
while ( pow(2.0, exp) < num ) /* 只要2.0^exp小于num,我就给它的幂自增 */
{
exp++;
}
exp--; // 因为上面while循环会多余增加一次exp,现在我给它自减一下
if ( pow(2.0, exp+1) == num ) /* 上面循环while我检测的是<而不是<=,这里我要测试下是不是= */
a[i++] = ++exp; /* 如果=我就要存储a[i]=++exp了,注意下标i要往后走一位 */
else
a[i++] = exp; /* 否则我就存储a[i]=exp了 */
num -= pow(2.0, exp);
}
for (int j = 0; j<i; j++)
{
if (j)
printf("+");
if (a[j] == 1) /* exp=1的格式比较特殊,给它专门搞个if */
printf("2");
else
printf("2(%d)", a[j]);
}
system("pause");
}
tips:这题有两个坑的地方:
1.输出格式:’+’只在两个数之间;exp=1的格式特殊
2.while循环判断条件是 < (<=其实也可以),后面如何保证<和=的各自条件都能考虑到exp到底是多少