前言
为什么这题这么水我还要放出来呢?因为这是一个经典的二进制题目,可以普及数论知识。
题目链接
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;//直接三次判断求解
}