NC212856. 鸽子的浮点运算
描述
输入描述
第一行一个数字T表示组数
接下来T行,每一行包括一个整数op(),以及两个浮点数a,b,op代表操作类型,具
体操作与题目表述中一致。
当op为1时,题目保证a==b,输出的答案也为a,b任一的二进制表示(因为两数相同)
当op为2时,输出的答案为a,b先转16位浮点后,再进行加法运算后结果的二进制进制表示
当op为3时,输出的答案为a,b先转16位浮点后,再进行乘法运算后结果的二进制表示
输出描述
⻅题目表述注:前导零不能省略
示例1
输入:
3 1 7.625 7.625 2 7.625 7.625 3 7.625 7.625
输出:
0100011110100000 0100101110100000 0101001101000100
C++(clang++11) 解法, 执行用时: 6ms, 内存消耗: 396K, 提交时间: 2020-10-27 14:02:00
#include<bits/stdc++.h> #define LL long long using namespace std; LL opt; float al,be; int T; LL ch(float x) { LL *y=(LL*)(&x); return *y; } float rh(LL x) { float *y=(float*)(&x); return *y; } int main() { cin>>T; while(T--) { scanf("%lld%f%f",&opt,&al,&be); LL x=ch(al); x&=(((1<<19)-1)<<13); al=rh(x); x=ch(be); x&=(((1<<19)-1)<<13); be=rh(x); if(opt==2) { al+=be; } if(opt==3) { al*=be; } x=ch(al); LL y=((x>>23)-127+15)<<10; x&=(((1<<10)-1)<<13); x>>=13; y+=x; for(LL i=15;i>=0;--i) { printf("%lld",(y&(1<<i))>>i); } printf("\n"); } return 0; }