1. 程式人生 > ># 從鍵盤輸入一個正整數,用2的冪次方的形式輸出。約定冪次方用括號來表示,即表示為2(b),b=1時,冪省略。例如139=2^7+2^3+2^1+2^0,即:2(7)+2(3)+2+2(0)

# 從鍵盤輸入一個正整數,用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到底是多少