【数论】SSL-1165

前言

为什么这题这么水我还要放出来呢?因为这是一个经典的二进制题目,可以普及数论知识。

题目链接

https://blog.csdn.net/xuxiayang/article/details/80171086#ssl-1165

题目大意

给定一个小数,求它二进制的前三位

思路1

对于一个小数,我们求其二进制的方法为*2取整正取整数部分,例如样例0.625

0.625 0.625
      ×             ×
       2               2


    1.25         1.25 ……1
去掉整数部分给 ans a n s
继续乘二
            0.25                         0.25
                ×                                 ×
                 2                                   2


            0.5                         0.5 ……0(取整数部分后1.25变成了0.25,乘2即为0.5)
再乘
              0.5                             0.5
                ×                                 ×
                 2                                   2


            1.00                         1.00 ……1(计算到1,递归结束,答案即为101(顺取))

代码1

#include<cstdio>
#include<cmath>
using namespace std;double k;int ans[101],len;
int main()
{
    scanf("%lf",&k);
    while(floor(k)!=k)//不为整数时继续
    {
        k*=2;
        if(k>=1) {ans[++len]=1;k-=1;}else ans[++len]=0;//乘2取整
    }
    printf("%d%d%d",ans[1],ans[2],ans[3]);//输出前三位
}

思路2

从题目出发,发现其只需要输出前三位,那么我们只需要进行三次运算,进而得出了这个时间复杂度 O(3) O ( 3 ) 的算法

代码2

#include<cstdio>
#include<cmath>
using namespace std;double k;int ans[101],len;//ans其实可以只开三个
int main()
{
    scanf("%lf",&k);
    while(floor(k)!=k&&len<3)//优化部分
    {
        k*=2;
        if(k>=1) {ans[++len]=1;k-=1;}else ans[++len]=0;
    }
    printf("%d%d%d",ans[1],ans[2],ans[3]);
}

代码3

对代码2进行优化,可以将空间复杂度也去掉

#include<cstdio>
#define p1 {putchar(49);k--;}
#define p0 putchar(48)
using namespace std;double k;
int main()
{
    scanf("%lf",&k);k*=2;
    if(k>=1) p1 else p0;k*=2;
    if(k>=1) p1 else p0;k*=2;
    if(k>=1) p1 else p0;//直接三次判断求解
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值