ZUFE 林教主的面试(数学题 小数进制转换)
林教主的面试
林教一表人才, 才高八斗, 英明神武, 英俊潇洒, 玉树临风, 风流倜傥, 盖世无双, 人见人爱, 花见花开, 十全十美, 完美无缺, 空前绝后, 名垂青史. 万古流芳. 林教凭借他一日万行的编码速度,和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位.
输出描述:
对于输入文件里的每个测试数据, 输出相应的答案, 答案的格式为n(10)=m(2), 具体可参照样例输出.
样例输入
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)
这道题当时真是无语了,整数部分转换2进制,从右往左,除二取余;小数部分从左往右,乘二取整。
代码如下:
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 void out(int n) 5 { 6 if(n>1) out(n/2); 7 printf("%d", n&1); 8 } 9 int main() 10 { 11 int a, b, k, re, ri; 12 scanf("%d", &re); 13 for(ri=1; ri<=re; ++ri) 14 { 15 scanf("%d.%d%d", &a, &b, &k); 16 printf("%d.%04d(10)=", a, b); 17 out(a); 18 printf("."); 19 while(k--) 20 { 21 b *= 2; 22 printf("%d", b/10000); 23 b %= 10000; 24 } 25 puts("(2)"); 26 } 27 return 0; 28 }