#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int g1,g2,len,flag,cnt1,cnt2,m;
int start,b[20],d[20],ans1[20];
char c[15],a[20],ans[20];
int size(int b)
{
if(c[b]=='G')
return 4;
if(c[b]=='M')
return 3;
if(c[b]=='K')
return 2;
if(c[b]=='B')
return 1;
}
void big()
{
m=pow(2,(g1-g2)*10);
for(int i=cnt1;i>=1;i--)//倒序转换
b[++b[0]]=a[i]-'0';
while(m>0)//转换
{
d[++d[0]]=m%10;
m/=10;
}
for(int i=1;i<=b[0];i++)//乘法
{
for(int j=1;j<=d[0];j++)
{
int t=i+j-1;
ans1[t]+=b[i]*d[j];
ans1[t+1]+=ans1[t]/10;
ans1[t]%=10;
}
}
start=b[0]+d[0];
while(ans1[start]==0)//去除前导0
start--;
for(int i=start;i>=1;i--)
printf("%d",ans1[i]);
printf(".000000");
}
void small()
{
a[++cnt1]='.';
m=pow(2,(g2-g1)*10);
int t=1,tmp=0;
while(t<=cnt1)//高精除
{
if(a[t]=='.')
{
ans[++cnt2]='.';
break;
}
tmp=tmp*10+(a[t]-'0');
if(tmp>m)
{
ans[++cnt2]=tmp/m+'0';
tmp-=(tmp/m)*m;
}else
ans[++cnt2]='0';
t++;
}
while(tmp>0)//再次高精除(因为一定能除尽,所以要继续)
{
tmp=tmp*10;
if(tmp>=m)
{
ans[++cnt2]=tmp/m+'0';
tmp-=(tmp/m)*m;
}else
ans[++cnt2]='0';
}
flag=0;
for(int i=1;i<cnt1;i++)//判断是否有前导0
if(ans[i]!='0')
flag=1;
if(flag==0)
start=cnt1-1;//去除前导0
else
start=1;
if(ans[cnt1+7]>'4')//四舍五入
ans[cnt1+6]++;
for(int i=start;i<=cnt1+6;i++)
printf("%c",ans[i]);
}
int main()
{
scanf("%s",c+1);
len=strlen(c+1);
for(int i=1;i<=len;i++)//a为数据,g1,g2为符号
{
if(c[i]=='=')
{
flag=1;
i++;//跳过问号
continue;
}else if(c[i]>='0'&&c[i]<='9')
{
a[++cnt1]=c[i];
}else
{
if(!flag)
{
g1=size(i);
if(g1>1)//符号多于一位,直接跳过
i++;
continue;
}else
{
g2=size(i);
break;
}
}
}
memset(ans,'0',sizeof(ans));
if(g1>g2)//用乘法
big();//大换小
else if(g1<g2)//用除法
small();//小换大
return 0;
}
我为了防止精度问题全都用了高精度,但只有80分,WA了第6和第10个点。谁来救救我