记录编号 27840 评测结果 AAAAA
题目名称 [NOIP 2000PJ]计算器的改良 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2011-10-08 18:21:24 内存使用 0.27 MiB
显示代码纯文本
//NOIP2000 普及組:計算器的改良
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
ifstream fin("computer.in");
ofstream fout("computer.out");

char righter[100];
char lefter[100];
int lenr=0,lenl=0;
char X; //未知数X
double con=0,unk=0;

void init()
{
    bool GetX=true;
    char c;
    fin>>c;
    while (c!='=')
    {
        if (GetX && islower(c))
        {
            X=c;
            GetX=false;
        }
        lefter[lenl]=c; 
        lenl++;
        fin>>c;
    }
    
    //fout<<lefter<<" "<<lenl<<endl;
    
    
    fin>>c;
    while (!fin.eof())
    {
        if (GetX && islower(c))
        {
            X=c;
            GetX=false;
        }
        righter[lenr]=c;
        lenr++;
        fin>>c;
    }
    
    //fout<<righter<<endl<<lenr<<endl;
}

int GetNumLen(char *str,int place,int len) 
{//測試字符串中從某點開始數字字符持續的長度
    int l=0;
    for (int i=place;i<len;i++)
    {
        if (isdigit(str[i]))
            l++;
        else return l;
    }
    return l;
}

int myatoi(char *str)
{
    int ret=0;
    int sign=1;
    if(*str=='-')
        sign=-1;
    else
        ret=ret*10+(*str-'0');
    str++;
    
    while(*str!= '\0')
    {
        ret=ret*10+(*str-'0');
        str++;
    }
    return sign*ret;
}

void scanl(char *str,int L)
{
    int now=0;
    if(str[now]=='-')
    {
        now++;
        if(now==L) return;
        
        if (str[now]==X)
        {
            unk-=1;
            now++;
            if(now==L) return;
        }
            
        if ( isdigit(str[now]) )
        {
            int len=GetNumLen(str,now,L);
            char temp2[102];
            memset(temp2,'\0',sizeof(temp2));
            for (int i=0;i<len;i++)
            {
                temp2[i]=str[i+now];
            }
            now+=len;
            if (str[now]!=X) con+=myatoi(temp2);
            else
            {
                unk-=myatoi(temp2);
                now++;
            }
        }
    }
    else
    {
        if (str[now]==X)
        {
            unk+=1;
            now++;
            if(now==L) return;
        }
            
        if ( isdigit(str[now]) )
        {
            int len=GetNumLen(str,now,L);
            char temp[102];
            memset(temp,'\0',sizeof(temp));
            for (int i=0;i<len;i++)
            {
                temp[i]=str[i+now];
            }
            now+=len;
            if (str[now]!=X) con-=myatoi(temp);
            else 
            {
                unk+=myatoi(temp);
                now++;
            }
        }
    }
    
    while(now<L)
    {
        if(str[now]=='-')
        {
            now++;
            if (str[now]==X)
            {
                unk-=1;
                now++;
                if(now==L) break;
            }
            
            if ( isdigit(str[now]) )
            {
                int len=GetNumLen(str,now,L);
                char temp[102];
                memset(temp,'\0',sizeof(temp));
                for (int i=0;i<len;i++)
                {
                    temp[i]=str[i+now];
                }
                now+=len;
                if (str[now]!=X) con+=myatoi(temp);
                else
                {
                    unk-=myatoi(temp);
                    now++;
                }
            }
        }
        
        if(str[now]=='+')
        {
            now++;
            if (str[now]==X)
            {
                unk+=1;
                now++;
                if(now==L) break;
            }
            
            if ( isdigit(str[now]) )
            {
                int len=GetNumLen(str,now,L);
                char temp[102];
                memset(temp,'\0',sizeof(temp));
                for (int i=0;i<len;i++)
                {
                    temp[i]=str[i+now];
                }
                now+=len;
                if (str[now]!=X) con-=myatoi(temp);
                else 
                {
                    unk+=myatoi(temp);
                    now++;
                }
            }
        }        
    }
}

void scanr(char *str,int L)
{
    int now=0;
    if(str[now]=='-')
    {
        now++;
        if(now==L) return;
        
        if (str[now]==X)
        {
            unk+=1;
            now++;
            if(now==L) return;
        }
            
        if ( isdigit(str[now]) )
        {
            int len=GetNumLen(str,now,L);
            char temp2[102];
            memset(temp2,'\0',sizeof(temp2));
            for (int i=0;i<len;i++)
            {
                temp2[i]=str[i+now];
            }
            now+=len;
            if (str[now]!=X) con-=myatoi(temp2);
            else
            {
                unk+=myatoi(temp2);
                now++;
            }
        }
    }
    else
    {
        if (str[now]==X)
        {
            unk-=1;
            now++;
            if(now==L) return;
        }
            
        if ( isdigit(str[now]) )
        {
            int len=GetNumLen(str,now,L);
            char temp[102];
            memset(temp,'\0',sizeof(temp));
            for (int i=0;i<len;i++)
            {
                temp[i]=str[i+now];
            }
            now+=len;
            if (str[now]!=X) con+=myatoi(temp);
            else 
            {
                unk-=myatoi(temp);
                now++;
            }
        }
    }
    
    while(now<L)
    {
        if(str[now]=='-')
        {
            now++;
            if (str[now]==X)
            {
                unk-=1;
                now++;
                if(now==L) break;
            }
            
            if ( isdigit(str[now]) )
            {
                int len=GetNumLen(str,now,L);
                char temp[102];
                memset(temp,'\0',sizeof(temp));
                for (int i=0;i<len;i++)
                {
                    temp[i]=str[i+now];
                }
                now+=len;
                if (str[now]!=X) con-=myatoi(temp);
                else
                {
                    unk+=myatoi(temp);
                    now++;
                }
            }
        }
        
        if(str[now]=='+')
        {
            now++;
            if (str[now]==X)
            {
                unk-=1;
                now++;
                if(now==L) break;
            }
            
            if ( isdigit(str[now]) )
            {
                int len=GetNumLen(str,now,L);
                char temp[102];
                memset(temp,'\0',sizeof(temp));
                for (int i=0;i<len;i++)
                {
                    temp[i]=str[i+now];
                }
                now+=len;
                if (str[now]!=X) con+=myatoi(temp);
                else 
                {
                    unk-=myatoi(temp);
                    now++;
                }
            }
        }        
    }
}

int main()
{
    init();
    scanl(lefter,lenl);
    scanr(righter,lenr);
    //fout<<unk<<" "<<con<<endl;
    //fout<<con/unk<<endl;
    float result;
    result=con/unk;
    if (result>-0.0005 && result<=0)  result=0;
    fout<<X<<"="<<setiosflags(ios::fixed)<<setprecision(3)<<result<<endl;
    return 0;
}