Description
NCL是一家專門從事計算器改良與升級的實驗室,最近該實驗室收到了某公司所委託的一個任務:需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了一個剛進入的新手ZL先生。爲了很好的完成這個任務,ZL先生首先研究了一些一元一次方程的實例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在計算器上鍵入的一個一元一次方程中,只包含整數、小寫字母及+、-、=這三個數學符號(當然,符號“-”既可作減號,也可作負號)。方程中並沒有括號,也沒有除號,方程中的字母表示未知數。
編寫程序,解輸入的一元一次方程, 將解方程的結果(精確至小數點後三位)輸出至屏幕。
你可假設對鍵入的方程的正確性的判斷是由另一個程序員在做,或者說可認爲鍵入的一元一次方程均爲合法的,且有唯一實數解。
Input
一個一元一次方程式
Output
方程的結果(精確至小數點後三位)
Sample Input
6a-5+1=2-2a
Sample Output
a=0.750
Source
NIOP2000普及組第一題
詳解見代碼註釋,有一個巧妙之處就是對於符號的處理以及判斷。
#include<cstdio>
int main()
{
int op=1,dir=1,num=0,a=0,b=0;
char ch,id;
while((ch=getchar())!=EOF)
{
if(ch>='a'&&ch<='z') //如果是變量,
{
id=ch; //用id記錄變量名
if(num==0)
num=1; //前面如果沒有係數,則係數是1
a+=op*num*dir; //不管有沒有,最終都加入運算
num=0; //讓num迴歸常態
}
else if(ch>='0'&&ch<='9') //如果是數字,用num記錄下來數值
num=num*10+ch-'0';
else //如果既不是變量,又不是數字,那就是運算符號。
{
b+=op*dir*num; /*巧妙之處*/
num=0; //算是對num、op的一種重置
op=1; //讓他們回到原始應該有的狀態,不影響以後的操作及判斷
if(ch=='=') //dir和op一樣,用來表示數值的符號
dir=-1;
else if(ch=='-')
op=-1;
}
}
printf("%c=%.3f",id,(float)-b/a+0); //此處的思想是ax+b=0;即x=-b/a;
return 0;
}
覺得不錯的老鐵們請點個贊,謝謝。