问题 A: 林教主的面试(进制换算)

题目描述

    林教一表人才, 才高八斗, 英明神武, 英俊潇洒, 玉树临风, 风流倜傥, 盖世无双, 人见人爱, 花见花开, 十全十美, 完美无缺, 空前绝后, 名垂青史. 万古流芳. 林教凭借他一日万行的编码速度,和5分钟内秒杀一切能做题目的惊人思维,还有对计算几何优化网络流等神级算法的深刻理解,获得所有集训队的一致认可, 在亚洲区域赛上更是摘金夺银, 独占鳌头.

  已经进入大四的林教, 由于难遇敌手, 以致于心灰意冷, 无心恋战, 毅然选择了直接进入人生的下一阶段----工作.

  林教首先来到了某国内知名公司(简称A公司). 由于A公司的所有员工都害怕林教进入A公司之后, 会掩盖了他们所有人的光芒, 但又不能明目张胆地去拒绝一个大大的人才, 于是都绞尽脑汁帮助面试官出各种世界性难题阻止林教拿到offer. As we all know, 林教的算法几乎是无敌的, 这些难题均被林教一一破解. 无奈之下, 面试官得知, 尽管林教懂二进制, 也懂小数, 但对二进制小数的理解颇为困惑(都怪当年逃课逃得太厉害了- -! ), 于是面试官眼前一亮, 临时出了一道具有一定误导性的题目: 请写出7.7(10)的二进制表示, 小数点后保留3位, 结果不需要四舍五入. 林教心想: 7(10)=111(2)这是无可辩驳的事实, 那7.7(10)就等于111.111(2). 于是, 他在面试官刚说完题目0.00000001秒便在纸上写上这个答案. 毫无悬念地, 林教就这样被无情地刷掉了!!! 林教在面试完回到寝室, 便发表状态: 在屌丝们的眼里, 7.7(10)也就只能等于111.111(2)了… 假如你是林教主, 你会给出什么样的答案呢?

输入格式

输入文件的第一行是一个正整数T, 代表测试数据的数量.

接下来T行, 每行为一个测试数据, 有两个数字, 第一个数字为一个十进制小数d, 为面试官出的题目里的数字, 0<=d<=10000, 且小数点后的数位都是4位; 第二个数字是一个非负整数k(1<=k<=100), 代表要给出的答案小数点后需要输出k位.

解题思路:

题目明确给出小数点后的数位数都是4,所以可以把小数点后的数当作一个整数(相当于小数乘以一万)输入(实际上也只能这么输入,如果按照小数输入可以发现当你想输入0.2257时输入的数其实和你想得到的数并不相同,这应该也是7360.2257 二进制小数只有40位的原因(试了将近一小时才发现QAQ)把小数按照整数输入后就把题目简化了,只需要分别将原数的整数部分化为二进制(将整数部分取余二直到整数部分为零)和小数部分化为二进制(乘二除以一万再取余一万(模拟小数二进制化))即可得到结果。

#include <iostream>
#include <cstdio>
#include <cstring>
 
using namespace std;
int main()
{
    int t;
	cin>>t;
	while(t--){
		int a,zs,ans[105]={0},xs,f,q;
		scanf("%d.%d%d",&zs,&xs,&a);//将一个数拆成整数小数小数点三部分,整数小数都按照整数形式输入 
		f=zs;//保存整数的值 
		q=xs;//保存小数的值 
		int i=0;
		printf("%d.%04d(10)=",f,q);//输出原数的时候需要注意小数都是四位不足四位需要用0填充 
		if(zs!=0){//特判zs是否一开始就等于零 
			while(zs){//若整数(zs)不为零则循环继续 
			ans[i]=zs%2;
			i++;	
			zs=zs/2;//化二进制过程 
		}
		while(i--){
			cout<<ans[i];//整数部分需要逆序输出 (也可以用递归进行对整数的操作,递归更为方便,不需要逆序输出) 
		}
		}
		else cout<<"0";
		cout<<".";
		int shuchu,j=0;
		while(j<a){//输出指定位数的小数 
			xs=xs*2;
			shuchu=xs/10000;
			xs=xs%10000;//小数部分的化二进制 
			cout<<shuchu;//直接输出即可 
			j++;
		}
		cout<<"(2)"<<endl;
	} 
    return 0;
}
 

输入样例

3
7.7000 3
0.5000 5
3.1416 2

输出样例

7.7000(10)=111.101(2)
0.5000(10)=0.10000(2)
3.1416(10)=11.00(2)

 

加强输入:

输入:7360.2257 100

输出:7360.2257(10)=1110011000000.0011100111000111011110011010011010110101000010110000111100100111101110110010111111101100010101101101(2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值