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<=0) result=0;
fout<<X<<"="<<setiosflags(ios::fixed)<<setprecision(3)<<result<<endl;
return 0;
}
#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;
}
沒有留言:
張貼留言