80分求助
查看原帖
80分求助
340728
2020许弘毅楼主2024/4/13 13:09
#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个点。谁来救救我

2024/4/13 13:09
加载中...