# 从键盘输入一个正整数,用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到底是多少

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值