题目来源:2的n次方计算_牛客题霸_牛客网
描述
不使用累计乘法的基础上,通过移位运算(<<)实现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
最后我们将代码放在牛客网中发现也是没问题的
结论:
本题的练习让我们对左移操作符进行了复习,也让我们掌握了一种非常规算法的2的n次方的求解方法,感兴趣的小伙伴可以自己尝试尝试哦~
如果各位小伙伴觉得对自己有所帮助的话 可以点赞收藏+关注哦~