题意:
给了一系列的用操作数转换为17位二进制数的关系..又给出了17位二进制数转化成十进制小数的关系...现在给出操作数..请退出其对应十进制小数.
题解:
这个不恶心..简单题...控制小数位..我使用ssprintf输入到字符串中再调整的...
Program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#define ll long long
#define oo 1<<29
#define pi acos(-1.0)
using namespace std;
char s[45]={"PQWERTYUIOJ#SZK*?F@D!HNM&LXGABCV"},c;
int H[300];
void PreWork()
{
int i;
for (i=0;i<32;i++) H[s[i]]=i;
H['A']=28,H['S']=12;
}
int A[30];
char ss[30];
int main()
{
int cases,id,t,x,i;
double ans;
PreWork();
scanf("%d",&cases);
while (cases--)
{
scanf("%d",&id);
do { c=getchar(); } while (c==' ');
t=0,x=H[c];
for (i=4;i>=0;i--)
if (x&(1<<i)) A[++t]=1;
else A[++t]=0;
scanf("%d",&x);
for (i=10;i>=0;i--)
if (x&(1<<i)) A[++t]=1;
else A[++t]=0;
do { c=getchar(); } while (c==' ');
if (c=='F') A[++t]=0;
else A[++t]=1;
ans=0;
for (i=2;i<=t;i++)
if (A[i]) ans+=1.0/(1<<(i-1));
if (A[1]==1) ans-=1;
sprintf(ss,"%.25f",ans);
for (i=20;i>=1;i--)
if (ss[i]!='0') break;
if (ss[i]=='.') i++;
ss[i+1]='\0';
printf("%d %s\n",id,ss);
}
return 0;
}