申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/

2011年10月26日 星期三

NOIP2000 普及組:計算器的改良 computer 解題報告

問題描述
NCL是一家專門從事計算器改良與升級的實驗室,最近該實驗室收到了某公司所委託的一個任務:需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了一個剛進入的新手ZL先生。爲了很好的完成這個任務,ZL先生首先研究了一些一元一次方程的實例:
4+3x=8
6a-5+1=2-2a
  -5+12y=0
ZL先生被主管告之,在計算器上鍵入的一個一元一次方程中,只包含整數、小寫字母及+、-、=這三個數學符號(當然,符號“─”既可作減號,也可作負號)。方程中並沒有括號,也沒有除號,方程中的字母表示未知數。
問題求解
編寫程序,解輸入的一元一次方程, 將解方程的結果(精確至小數點後三位)輸出至屏幕。
你可假設對鍵入的方程的正確性的判斷是由另一個程序員在做,或者說可認爲鍵入的一元一次方程均爲合法的,且有唯一實數解。
樣 例
輸入:6a-5+1=2-2a
輸出:a=0.750

【分析】
表達式處理問題,算出一次項係數、常數,然後相處即可。

【我的代碼】
雖然滿分了,但是代碼死長死長的,十分冗雜!
#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<=0result=0;
    fout<<X<<"="<<setiosflags(ios::fixed)<<setprecision(3)<<result<<endl;
    return 0;
}

沒有留言:

張貼留言