題目來源:
https://www.nowcoder.com/practice/35a1e8b18658411388bc1672439de1d9?tpId=107&&tqId=33310&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking
描述
不使用累計乘法的基礎上,通過移位運算(<<)實作2的n次方的計算。
資料範圍:0<=n<31
輸入描述:
一行輸入整數n(0 <= n < 31)。
輸出描述:
輸出對應的2的n次方的結果。
示例1
輸入:
2
輸出:
4
示例2
輸入:輸出:10
1024
代碼實作:
//位運算
int main()
{
int n = 0;
scanf("%d", &n);
//移位
int sum = 1 << n;
//或者
int sum2 = 2 << (n - 1);
printf("%d", sum);
return 0;
}
代碼分析:
題目要求計算2的n次方的結果,我們當然首先會想到使用math函數中的pow函數,直接pow(2,n)就可以解決問題,代碼如下:
正常算法
int main()
{
int n = 0;
scanf("%d", &n);
int sum = pow(2, n);
printf("%d", sum);
return 0;
}
但是題目還有一個要求說:使用移位運算
那麼顯然正常算法是不可以在這裡使用的
我們首先來思考移位操作符是怎麼操作一個數字的。
在之前操作符知道:
移位操作符: >> <<
移位操作符:其實是作用于一個數的二進制數
舉例我們可得知:
int main() {
int a = 3;
int b = a << 1;
printf("%d\n", b);
// 00000000 00000000 00000000 00000011 --3
//a<<1
// 00000000 00000000 00000000 00000110 --6
return 0;
}
轉換成十進制,我們發現給一個數字左移一位就像給這個數字乘上了2
那麼我們顯然可以得知,要計算2的n次方,我們可以給數字1的二級制數左移n位就得到了2的n次方
是以我們用代碼實作:
//位運算
int main()
{
int n = 0;
scanf("%d", &n);
//移位
int sum = 1 << n;
printf("%d", sum);
return 0;
}
或者我們用數字2開始左移(n-1)位也是可以的
編輯
到底和上面一樣
測試:
示例1
輸入:
2
輸出:
4
示例2
輸入:輸出:10
1024
最後我們将代碼放在牛客網中發現也是沒問題的