hihocoder1311 二进制小数

  

时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个十进制小数X,判断X的二进制表示是否是有限确定的。

例如0.5的二进制表示是0.1,0.75的二进制表示是0.11,0.3没有确定有限的二进制表示。

输入
第一行包含一个整数 T (1 ≤ T ≤ 10),表示测试数据的组数。

以下T行每行包含一个十进制小数 X (0 < X < 1)。 X一定是以"0."开头,小数部分不超过100位。

输出
对于每组输入,输出 X 的二进制表示或者NO(如果 X 没有确定有限的二进制表示)。

样例输入
3
0.5
0.75
0.3
样例输出
0.1
0.11
NO

题意:十进制小数转二进制,输出二进制小数,无限循环则输出NO

题解:二进制小数,高精度乘法加个特判即可,这里还用到了hash

#include <bits/stdc++.h>
using namespace std;
map<int, int>mp;
string s, ans;
int BKDRHash(string s){
    long long seed=131;
    long long hash=0;
    int i = 0;
    while(i<s.size()&&s[i]) hash=hash*seed+(s[i++]);
    return (hash & 0x7FFFFFFF);
}
string Multiply(string s,int x){//模版
    reverse(s.begin(),s.end());
    int cmp=0;
    for(int i=0;i<s.size();i++){
        cmp=(s[i]-‘0‘)*x+cmp;
        s[i]=(cmp%10+‘0‘);
        cmp/=10;
    }
    while(cmp){
        s+=(cmp%10+‘0‘);
        cmp/=10;
    }
    reverse(s.begin(),s.end());
    return s;
}
bool f(string s){
    int i;
    for(i=0;i<s.size();i++)
        if(s[i] != ‘0‘) break;
    if(i>=s.size()) return 1;
    return 0;
}
int main(){
    int T, flag, l;
    cin>>T;
    while(T--){
        cin>>s;
        int i = s.size()-1;
        while(i>=0&&s[i]==‘0‘) i--;
        if(i>=0&&s[i]!=‘5‘) {
            cout<<"NO"<<endl;
            continue;
        }
        ans = "";mp.clear();
        flag = 0;
        s.erase(0,2);
        l = s.size();
        while(mp[BKDRHash(s)] == 0){
            mp[BKDRHash(s)] = 1;
            s = Multiply(s, 2);
            if(f(s)){
                flag = 1;
                break;
            }
            if(s.size() != l) s.erase(0, 1), ans += ‘1‘;
            else ans += ‘0‘;
        }
        if(flag == 1) cout<<"0."<<ans<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
时间: 2024-08-05 10:58:17

hihocoder1311 二进制小数的相关文章

C#控制台基础 无符号二进制小数转换为十进制

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 code 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Co

将十进制小数转化为二进制小数

小数表示原理 你了解小数的表示原理吗? 我的十进制小数换成二进制该如何表示? 比如:0.3 的二进制表示为:0.0100110011001.... (小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列. 0.8125x2=1.625 取整1,小数部分是0.625 0.625x2=1.25 取整1,小数部分是0.25 0.25x2=0.5 取整0,小数部分是0.5 0.5x2=1.0 取整1,小数部分是0,结束 所以0.8125的二进制是0.1101) import j

深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准

整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题.但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生了. 在 20世纪80年代以前,每个计算机厂商都设计了自己表示浮点数的规则,以及对浮点数执行运算的细节,这对于应用程序在不同机器上的移植造成了巨大的困难.而在这之后,也就是 1985年左右,IEEE 标准产生了,这是一个仔细制定的表示浮点数及其运算的标准,现在的计算机浮点数也都是采用这个标准. 浮点数不

十进制小数和二进制小数之间的转换

一.二进制数转换成十进制数 由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和.这种做法称为"按权相加"法.     例1105 把二进制数110.11转换成十进制数. 二.十进制数转换为二进制数 十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并.     1. 十进制整数转换为二进制整数 十进制整数转换为二进制整数采用"除2取余,逆序排列"法.具体做法是

利用matlab将二进制小数转换为十进制小数

注意,这个函数只能转换二进制小数,即形如 0.1101110001的格式,而形如110110.00101001则无法进行转换. function d = bintodec(binstr) binstr = binstr(3:end); %提取小数点后的字符 len = length(binstr); sum = 0; for i = 1:len if binstr(i) == '0' %这个ifelse的作用是把字符值变换为数字值 binstr(i) = 0; else binstr(i) =

20145225 《信息安全系统设计基础》期中总结

期中总结 一.常用命令总结 man -k: 常用来搜索,结合管道使用.例句如下: man -k k1 | grep k2 | grep 2 搜索同时含有k1和k2,且属于系统调用. 最后的数字意味着帮助手册中的区段,man手册共有8个区段,最常用的是123,含义如下: 1.Linux 2.系统调用 3.c语言 但是当单独用man语句的时候,想查看其中的单独某个区段内的解释时,用法是这样的: man 3 printf 即查找c语言中printf的用法. grep -nr 这条语句可以用来查找关键字

03 php 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换,算术运算,比较运算

03 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换, 算术运算,比较运算,逻辑运算,短路现象, 三目运算符,字符型运算: 数据类型 整体划分 标量类型: int, float, string, bool 复合类型: array,     object 特殊类型: null,     resouce 整数类型int, integer 3种整数表示法 十进制写法:123: $n1 = 123; 八进制写法: 0123 $n2 = 0123; 十六进制写法: 0x123 $n3

第一章 数制和码制

1.数字电路:工作在数字信号下的电子电路称为数字电路. 2.自然界中形形色色的物理量,就其变化规律的特点而言,可以分为两大类:(数字量)数字信号和模拟量(模拟信号). 3.数字量:物理量的变化在时间和数量上都是离散的,也就是说它们的变化在时间上是不连续的,总是发生在一系列离散的瞬间.而且,它们数值的大小和每次的增减变化都是某个最小数量单位的整数倍,而小于这个最小数量单位的数值没有任何物理意义. 4.模拟量:物理量的变化在时间或数值上是连续的.而且,物理量在连续变化过程中的任何一个取值都有具体的物

转载---编写高质量代码:改善Java程序的151个建议(第2章:基本类型___建议21~25)

阅读目录 建议21:用偶判断,不用奇判断 建议22:用整数类型处理货币 建议23:不要让类型默默转换 建议24:边界还是边界 建议25:不要让四舍五入亏了一方 不积跬步,无以至千里: 不积小流,无以成江海. ---荀子<劝学篇> 回到顶部 建议21:用偶判断,不用奇判断 判断一个数是奇数还是偶数是小学里的基本知识,能够被2整除的整数是偶数,不能被2整除的数是奇数,这规则简单明了,还有什么可考虑的?好,我们来看一个例子,代码如下: 1 import java.util.Scanner; 2 3