HDOJ 4239 - Decoding EDSAC Data 模拟

                题意:

                         给了一系列的用操作数转换为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;
}
 


你可能感兴趣的:(HDOJ 4239 - Decoding EDSAC Data 模拟)