# 从键盘输入一个正整数,用2的幂次方的形式输出。约定幂次方用括号来表示,即表示为2(b),b=1时,幂省略。例如139=2^7+2^3+2^1+2^0,即:2(7)+2(3)+2+2(0)

样例输入:

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到底是多少

    原文作者:B树
    原文地址: https://blog.csdn.net/weixin_43469047/article/details/83687816
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞