計算器的改良

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;
}
覺得不錯的老鐵們請點個贊,謝謝。
發佈了34 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章