算法日记(二)

幂和对数

跟英雄哥学习算法的过程收获是很多的,以下我将写出我的体会,感想,错误《算法零基础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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forget hurt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值