幂和对数
跟英雄哥学习算法的过程收获是很多的,以下我将写出我的体会,感想,错误《算法零基础100讲》(第1讲) 幂和对数_英雄哪里出来-优快云博客
在c语言中,我们可以利用函数log2(T)来计算以二为底的对数,log10(T)来计算以10为底T的对数。前提是要调用math.h数学库。
也需要用到数学知识(换底公式)log(a)(b)=log(c)(b)/log(c)(a)
而在c语言中我们需要写成log2(b)/log2(a)
接下来就是题了,也算是我的解题报告
231. 2 的幂 - 力扣(LeetCode) (leetcode-cn.com)
(34条消息) ☀️光天化日学C语言☀️(25)- 浮点数的精度问题 | 浮点数判等千万不要写成 a == b_英雄哪里出来-优快云博客
我们的目的是判断给出的整数是否是2的幂,需要注意的地方就是精度问题,因为sqrt,pow函数的返回值都是浮点数,所以难免有误差,浮点数的判断方法:两数相减的绝对值小于某一精度,如果小于该精度,则返回true,否则返回false。
#include<bits/stdc++.h>//这里我用acm模式打
using namespace std;
bool isPowerOfTwo(int n)
{
if(n<=0)
return false;
int x=(int)(log2(n)+1e-8);//在判断 n == 2^x 时,因为 pow(2, x) 返回值是一个double类型的浮点数,所以不能直接用 == 来判断,浮点数的判断方法:两数相减的绝对值小于某一精度,如果小于该精度,则返回true,否则返回false
if(fabs((n-pow(2,x)))<1e-8)//为了防止丢失精度所以加1e-8
{
return true;
}
else
return false;
}
int main()
{
int n;
cin>>n;
printf("%d",isPowerOfTwo(n));//如果是2的幂则将返回真(1),否则为假(0)
return 0;
}
326. 3的幂 - 力扣(LeetCode) (leetcode-cn.com)
一样的
#include<bits/stdc++.h>//这里我用acm模式打
using namespace std;
bool isPowerOfTwo(int n)
{
if(n<=0)
return false;
int x=(int)(log2(n)/log2(3)+1e-8);//在判断 n == 3^x 时,因为 pow(3, x) 返回值是一个double类型的浮点数,所以不能直接用 == 来判断,浮点数的判断方法:两数相减的绝对值小于某一精度,如果小于该精度,则返回true,否则返回false
if(fabs((n-pow(3,x)))<1e-8)//为了防止丢失精度所以加1e-8
{
return true;
}
else
return false;
}
int main()
{
int n;
cin>>n;
printf("%d",isPowerOfTwo(n));//如果是2的幂则将返回真(1),否则为假(0)
return 0;
}
342. 4的幂 - 力扣(LeetCode) (leetcode-cn.com)
#include<bits/stdc++.h>//这里我用acm模式打
using namespace std;
bool isPowerOfTwo(int n)
{
if(n<=0)
return false;
int x=(int)(log2(n)/log2(4)+1e-8);//在判断 n == 4^x 时,因为 pow(4, x) 返回值是一个double类型的浮点数,所以不能直接用 == 来判断,浮点数的判断方法:两数相减的绝对值小于某一精度,如果小于该精度,则返回true,否则返回false
if(fabs((n-pow(4,x)))<1e-8)//为了防止丢失精度所以加1e-8
{
return true;
}
else
return false;
}
int main()
{
int n;
cin>>n;
printf("%d",isPowerOfTwo(n));//如果是2的幂则将返回真(1),否则为假(0)
return 0;
}