所需知识
函数
循环
递归
位操作
- 题目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的个数
}
};