题:1s运行程序------double^int,统计2进制1的个数

所需知识
函数
循环
递归
位操作

  • 题目1:
  • 时间限制:1秒
  • 空间限制:32768K
  • 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方

❀思路分析
1.暴力循环法
码如其名,循环完成,每次乘以底数base,循环exponent次方

double Power(double base,int exponent)
{
	int sum = 0; //用来存放每次乘完base的值
	while(exponent--) //后置--,用完值后才减
	{
		sum *= base;
	}
	return sum;
}

×超时,不通过
2.暴力递归法

double Power(double base,int exponent)
{
	if(exponent == 0)
		return 1;
	else if(exponent == 1)
		return base;
	else
	{
		return base*Power(base,exponent-1);
	}
}	

×超时,不通过
3.?终极递归法(通过版)
拆分,依次计算

public:
    double Power(double base, int exponent) {
       if(exponent == 0)//如果指数为0,值恒为1,任何实数的0次方都为1
           return 1;
        else if(exponent >0)
        {
            if(exponent == 1)
                return base;
            else if(exponent%2 == 0)    //次数为2的倍数,进行拆分,例如(6.5)^4 = (6.5)^2*(6.5)^2
            {
                return Power(base,exponent/2)*Power(base,exponent/2);
            }
            else      //非2的倍数
            {
                return Power(base,exponent/2)*Power(base,exponent/2+1);
            }
        }
        else  //次数<0时,例如(6.5)^(-3) =1/(6.5)^3
        {
            return 1/Power(base,0-exponent);  //将其转化为exponent>0的情况
        }
    }
};
  • 题目2:
  • 时间限制:1秒
  • 空间限制:32768K
  • 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
    ❤位运算符法(通过版)
class Solution {
public:
     int  NumberOf1(int n) 
     {
         int count = 0;                  //十进制32位二进制数
         for(int i = 0; i<32; i++)   //负数在内存中的存储格式是补码,可直接运算
         {
             if( (n&1) == 1)    //&按位与运算符,n&1取出n中的2进制形式的最低位
                 count++;
             n = n>>1;          //每次判断完以后将字符串右移,将下一个要取的高位放在最低位上
         }
         return count;         //返回统计出的1的个数
     }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值