如何判断一个数 n 是否是2的K次方?

注意:不用求K是多少,只需要判断,请编写函数实现。

核心思想:按位与(&),  n = m & (m - 1);

考虑2的k次方数的特点,每一个2的k次方数转化为2进制之后,只有一位为1,我们只需要判断二进制位上是不是只有一个1

用m&(m - 1)就是在消除二进制位上的1,由于二进制位只有一个1, 所以 n = 0.

#include<stdio.h>
#include<stdlib.h>
int IsPow(int m)
{
	if (m < 1)
		return 0;
	int n = m&(m - 1);
	return n == 0;//n==0是判断表达式,该表达式返回的是 真假,
	//因此return n == 0;就是先判断n 是否等于0,若等于则返回真(1),否则返回假(0)
}

int main()
{
	int m, k;
	printf("请输入一个整数m:\n");
	scanf("%d", &m);
	if (IsPow(m))
	{
		printf("%d是2的K次方\n", m);
	}
	else
	{
		printf("%d不是2的K次方\n", m);
	}
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下递归函实现n的k次方: def power(n, k): if k == 0: return 1 elif k % 2 == 0: return power(n, k/2) * power(n, k/2) else: return n * power(n, k-1) 这个函首先检查k是否为0,如果是,则返回1。如果k是偶,则将问题分解为计算n的k/2次方的平方。如果k是奇,则将问题分解为计算n的k-1次方并乘以n。这个递归过程将一直进行,直到k减少到0,然后返回1。 ### 回答2: 下面是一个使用递归实现计算n的k次方的函的示例代码: ```python def power(n, k): # 递归边界:指k为0时,任何的0次方都是1 if k == 0: return 1 # 递归调用,缩小问题规模:将n的k次方分解为n的k-1次方乘以n else: return n * power(n, k-1) ``` 使用递归的思想,我们将n的k次方不断地分解为n的k-1次方乘以n,在递归到指0时,返回1作为递归的边界条件。在每一次递归调用中,问题规模减小,指k减1。当指k减小到0时,递归结束,返回1。递归的过程中,每次返回的结果与n相乘,最终得到n的k次方的结果。 例如,调用`power(2, 3)`时,会逐步进行如下的递归调用和返回过程: 1. `power(2, 3)` --> 返回 `2 * power(2, 2)` 2. `power(2, 2)` --> 返回 `2 * power(2, 1)` 3. `power(2, 1)` --> 返回 `2 * power(2, 0)` 4. `power(2, 0)` 达到递归边界,返回 `1` 5. 返回上一层,计算 `2 * 1`,得到最终结果 `2 * 2 * 1 = 8`,即2的3次方。 ### 回答3: 递归实现一个来计算n的k次方可以通过以下步骤来完成: 1. 首先要考虑边界情况,即当k等于0时,结果应该是1,因为任何的0次方都等于1,所以我们可以返回1作为基线条件。 2. 否则,当k大于0时,我们可以使用递归来进行计算。我们需要将问题分解为更小的问题,不断减少k的值。我们可以将n的k次方表示为n * n的k-1次方。然后,我们可以使用递归调用来计算n的k-1次方。 3. 在递归调用中,我们需要将n和k-1作为参传递给递归函,直到k等于0时返回1。每次递归调用时,我们将n与前一次计算得到的结果相乘。 以下是使用递归实现计算n的k次方的示例代码: ```python def power(n, k): if k == 0: return 1 else: return n * power(n, k-1) n = 2 k = 3 result = power(n, k) print("{} 的 {} 次方为:{}".format(n, k, result)) ``` 在上面的示例代码中,我们定义了一个名为power的函,它接受n和k作为参。如果k等于0,函返回1作为基线条件。否则,函将n与调用自身的返回值相乘,并将k减小1。最终,我们将得到n的k次方的结果,并将其打印出来。 在上面的示例中,我们使用n等于2,k等于3来计算2的3次方。输出结果为8,因为2的3次方等于8。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值