洛谷P1022 計算器的改良

2021-10-23 06:23:05 字數 1715 閱讀 1808

乙隻鶸的刷題記錄

題目背景

ncl是一家專門從事計算器改良與公升級的實驗室,最近該實驗室收到了某公司所委託的乙個任務:需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了乙個剛進入的新手zl先生。

題目描述

為了很好的完成這個任務,zl先生首先研究了一些一元一次方程的例項:

4+3x=8

6a-5+1=2-2a

-5+12y=0

zl先生被主管告之,在計算器上鍵入的乙個一元一次方程中,只包含整數、小寫字母及+、-、=這三個數學符號(當然,符號「-」既可作減號,也可作負號)。方程中並沒有括號,也沒有除號,方程中的字母表示未知數。

你可假設對鍵入的方程的正確性的判斷是由另乙個程式設計師在做,或者說可認為鍵入的一元一次方程均為合法的,且有唯一實數解。

輸入格式

乙個一元一次方程。

輸出格式

解方程的結果(精確至小數點後三位)。

輸入輸出樣例

輸入 #1

6a-5+1=2-2a

輸出 #1

a=0.750

(來自於題解中的大佬,記錄於此)

對於每個資料,要想清楚地辨別它的身份,我們只需解決三個問題:

1.該資料是正數還是負數?

3.該資料在等號左側還是在等號右側?

2.該資料是常數還是係數?

第乙個問題看似十分無腦,用乙個變數f1來儲存符號即可(將f1賦值為1或-1,在讀入資料結束時將得到的資料乘以f1)。但需特別注意,在乙個表示式的開頭(等號左側和等號右側的表示式)不會有『+』、『-』符號,所以在程式的開頭和讀入『=』號是,要將f1賦值為1。

第二個問題也非常簡單,可以用變數f2來儲存。因為這個問題與移項運算的符號有關,因此也可以將f2賦值為1或-1,並約定在等號左側時f2為1,在等號右側時f2為-1。(當然你也可以反著約定)

第三個問題同樣不難解決。在讀入資料結束後(即讀入了乙個符號),判斷這個符號是運算子還是字母即可。如果是字母,則將得到的資料移到等號右側,否則將資料移到等號左側。但是還有乙個注意點:如果乙個未知數的係數為1,我們會將係數省略。因此在讀入資料為0時,我們要將其更改為1。

//看到題目以後完全沒有思路,於是借鑑題解中別人的解法,記錄於此

#include

using namespace std;

int l, r;

//l代表係數,r代表常數

char x;

//用x儲存字母

void

solve()

else

else r +

= tmp *

(-f2)

* f1;

tmp =0;

}if(c ==

'+')

else

if(c ==

'-')

else

if(c ==

'=')}if

(tmp !=

0) r +

= tmp *

(-f2)

* f1;

}int

main()

洛谷 P1022 計算器的改良

題目背景ncl是一家專門從事計算器改良與公升級的實驗室,最近該實驗室收到了某公司所委託的乙個任務 需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了乙個剛進入的新手zl先生。題目描述 為了很好的完成這個任務,zl先生首先研究了一些一元一次方程的例項 4 3x 8 6a 5 ...

洛谷 P1022 計算器的改良

題目背景 ncl是一家專門從事計算器改良與公升級的實驗室,最近該實驗室收到了某公司所委託的乙個任務 需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了乙個剛進入的新手zl先生。題目描述 為了很好的完成這個任務,zl先生首先研究了一些一元一次方程的例項 4 3x 8 6a 5...

洛谷 P1022 計算器的改良

題目 計算器的改良 思路 把方程以 為界拆成兩段,對於每一段假設前面沒有 號,就新增乙個 號,且每一段的結尾加乙個 號。再把兩段的未知數係數和常數項合併,移項,化係數為1求得。注意當常數項為0時要特殊處理,避免出現精度問題。includeusing namespace std string a in...