好心人告诉我#19是什么,最好帮我看看丑陋的代码
查看原帖
好心人告诉我#19是什么,最好帮我看看丑陋的代码
43103
Tanktt楼主2020/12/3 21:12
#include<bits/stdc++.h>
using namespace std;
const int N=10012;
double a[N],ans,sum;
int be,n;
char ele[N][2],s[100002];
inline double calc()
{
    char p=ele[n][0],q=ele[n][1];
    if (p=='H'&&q=='g') return 201;
    if (p=='H'&&q=='f') return 178.5;
    if (p=='H') return 1;
    if (p=='B') return 137;
    if (p=='C'&&q=='u') return 64;
    if (p=='C'&&q=='l') return 35.5;
    if (p=='C'&&q=='a') return 40;
    if (p=='C') return 12;
    if (p=='N'&&q=='a') return 23;
    if (p=='N') return 14;
    if (p=='O') return 16;
    if (p=='F'&&q=='e') return 56;
    if (p=='F') return 19;
    if (p=='M'&&q=='g') return 24;
    if (p=='M'&&q=='n') return 55;
    if (p=='A'&&q=='g') return 108;
    if (p=='A'&&q=='u') return 197;
    if (p=='A') return 27;
    if (p=='S'&&q=='i') return 28;
    if (p=='S') return 32;
    if (p=='P') return 31;
    if (p=='K') return 39;
    if (p=='Z') return 65;
    if (p=='I') return 127;
    if (p=='P') return 195;
}
int main()
{
    scanf("%s",s+1);int len=strlen(s+1);
    int i=0; 
    while (i<=len)
    {
        i++;
        if (s[i]=='~') break;
        if (s[i]>='A'&&s[i]<='Z') {
            ele[++n][0]=s[i];
            if (!((s[i+1]>='a')&&(s[i+1]<='z'))) a[n]=calc();
            continue;
        }
        if (s[i]>='a'&&s[i]<='z') {ele[n][1]=s[i];a[n]=calc();}
        if (s[i]=='('){ sum=0,be=n;}
        if (s[i]==')') 
        {
        	for (int j=be+1; j<=n; j++)sum+=a[j];
        }
        if (s[i]=='{')
        {
            i++;int x=0;
            while ((s[i]>='0')&&(s[i]<='9'))
            {
                x=(x<<1)+(x<<3)+s[i]-48;
                i++;
            }
            if (sum>0)
            for (int j=be+1; j<=n; j++) a[j]*=x;
            else a[n]*=x;
            sum=0;
        }
        /*printf("%d\n",n);
        for (int j=1; j<=n; j++)
        {
        	putchar(ele[j][0]);putchar(ele[j][1]);
        	printf("%.1f\n",a[j]);
		}
		printf("sum:%.1f\n",sum);
		printf("ans:%.1f\n",ans);*/
    }
    
   // if ((s[i-1]>='A'&&s[i-1]<='Z')||(s[i-1]>='a')&&(s[i-1]<='z')) a[n]=calc();
    for (int j=1; j<=n;j++) sum+=a[j];ans+=sum;
    //printf("%.1f\n",ans);
    if (s[i]=='~')
    {
    	double y=0;
        i++;
        if (s[i]>='0'&&s[i]<='9')
        {
      	 while ((s[i]>='0')&&(s[i]<='9'))
        	{
         	   y=y*10+s[i]-48;
            i++;
        	}
        	ans+=18.0*y;
		}
		else ans+=18;
    }
    if ((ans-(int)ans)!=0) printf("%d.5",(int)ans);
    else printf("%d\n",(int)ans);
    return 0;
}
2020/12/3 21:12
加载中...