HPU无穷小数

本文介绍了一种方法,用于判断一个十进制小数在转换为二进制后,其小数部分是否为有限长度。通过将小数放大并转化为整数,再通过特定算法循环判断来实现。

无穷小数

在十进制下,我们能够很轻易地判断一个小数的位数是有穷的或无穷的,但是把这个小数用二进制表示出的情况下其有穷性和无穷性就会发生改变,比如

十进制下的 0.5 ,在二进制下的值为 0.1 ;
十进制下的 0.75 ,在二进制下的值为 0.11 ;
十进制下的 0.6 ,在二进制下的值为 0.1001100......

给你一个十进制的小数,判断其在二进制表示下小数位数是否无穷。

输入格式

多组输入,处理到文件结束
每组数据输入一个六位的小数 n.(0≤n<1)

输出格式

如果在二进制下小数位数是有穷的,输出”YES”,否则输出”NO”.

样例

input

0.500000
0.600000
0.750000

output

YES
NO
YES

对于这一题的思路主要是将小数后六位转化为整数然后进行输出。比如0.500000可以乘以1e7然后转化为整数然后进行乘以2如果大于1e7就减去 然后进行循环判断如果循环多少次就是无穷这里可以设定为100次 其次就是如果恰好等于1e7则证明这个数不是无穷小数

代码如下

using namespace std;
int main(){
	double y;
	while(scanf("%lf",&y)!=EOF){
		y*=10000000;
		bool flag=0;
		long long x=(long long)y;
		int num=0;
		while(1){
		    if(x==0) break;
			if(num>=200){
				flag=1;break;
			}
			num++;
			x=2*x;
			if(x>=10000000) x-=10000000;
			if(x==0) break;
		}
		if(flag) puts("NO");
		else puts("YES");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值