EOJ 2845 符號方程求解

2021-10-05 21:32:40 字數 2788 閱讀 8708

一道多項式的題目,我寫了好久,一直在嘗試修改,寫到最後整個人渾渾噩噩的,最後**寫了好長。不說了,說多了都是淚。。。。。。

單點時限: 2.0 sec

記憶體限制: 256 mb

解一元一次方程,輸出方程的解(精確至小數點後 3 位)。

例如,以下是幾個一元一次方程的例項:

4+3x=8

6a-5+1=2-2a

-5+12y=0

+a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a+1098=123-1245+23712-1-1-0-20

-x-x-x-x-x-x-x-101=2

y-1=0

1=x-6c-5c+1=2-2c

在方程中,只包含整數、小寫字母及+、-、= 三個符號(符號 - 既可作減號,也可作負號)。方程中沒有括號,也沒有除號,方程中的小寫字母表示要求解的未知數。

輸入保證一元一次方程均為合法的,且有唯一實數解。

輸入格式

一行資訊,是乙個合法的一元一次方程。行的長度小於 80。

輸出格式

一行資訊,是方程的解。格式參考輸出例子。

樣例:input

6a-5+1=2-2a

output

a=0.750

先找到等式中「=」的位置,做乙個標記flag,然後分兩步,第一步計算等號左邊的代數式中每乙個符號(『+』,『-』)後面的數值或者係數,通過判斷符號型別計算,結果分別儲存到sumleft_num和sumleft_x裡面,第二步和第一步類似,計算等式右邊,結果儲存到sumright_num和sumright_x裡面。

最後就可以得到四個值,形如:左邊的數+未知數係數=右邊的數+未知數係數,通過我們的解方程知識就可以得出結果。

#include

#include

#include

#include

intmain()

if(s1[i]

>=

'a'&&s1[i]

<=

'z') word=s1[i];}

//找到等號的位置並確定方程的未知數

int sumleft_num=

0,sumleft_x=

0,sumright_num=

0,sumright_x=0;

int cnt=

0,ans=0;

for(i=

0;i//如果有字母則代表所求的為未知數的係數,將key調整

cnt=0;

if(key==0)

int temp1=0;

for(j=i;s1[j]

>=

48&&s1[j]

<=

57;j++)}

//如果為常數且首符號是加號或者在開始,進行常數的加法運算,結果進行儲存。

if(s1[i-1]

=='-'

&&i!=0)

int temp1=0;

for(j=i;s1[j]

>=

48&&s1[j]

<=

57;j++)}

//如果為常數且首符號是減號,進行常數的減法運算,結果進行儲存。}if

(key!=0)

if(cnt==

0) sumleft_x+=1

;if(cnt!=0)

}//如果為未知數係數且首符號是加號或者在開始,進行係數的加法運算,結果進行儲存。}if

(s1[i-1]

=='-')if

(cnt==

0) sumleft_x-=1

;if(cnt!=0)

}//如果為未知數且首符號是減號,進行係數的減法運算,結果進行儲存。}}

}}//以下是右側代數式的運算,和上面類似,注意初始化和臨界點問題即可

for(i=flag+

1;ians=0;

if(key1==0)

int te***=0;

for(j=i;s1[j]

>=

48&&s1[j]

<=

57;j++)}

if(s1[i-1]

=='-'

)int te***=0;

for(j=i;s1[j]

>=

48&&s1[j]

<=

57;j++)}

}if(key1!=0)

if(ans!=0)

}}if(s1[i-1]

=='-')if

(ans==

0) sumright_x-=1

;if(ans!=0)

}}}}

}double sum;

double sum_num,sum_x;

sum_num=sumright_num-sumleft_num;

sum_x=sumleft_x-sumright_x;

sum=sum_num/sum_x;

printf

("%c=%.3lf\n"

,word,sum)

;//計算求出,保留三位小數

return0;

}

乍一看這樣的題目還是有些頭暈的,不過好歹寫出來了,雖然忙活了很久,但是看到ac還是很開心的,這樣的**太過於繁瑣應該會有更簡單的方法,有時間再考慮考慮吧。

ps:讀入字串的時候用了gets,實際上因為安全性的問題gets函式並不是最好的選擇,eoj在一些題目上已經禁止了該函式,轉而使用fgets函式。(寫完時候突然發現的,懶得改了qaq。。。。。。)

坦克大戰(nyoj284)

題目大體意思就是,求從地圖上的y走到t的最小步數,其中s和r不能走,b要走兩步,e要走一步。測試輸入 3 4 ybeb eere sste 0 0測試輸出 8 這個題要用優先佇列,不用的話沒有辦法保證所求的步數是最小的。我也查了一些關於優先佇列的資料,做以下整理 在優先佇列中,優先順序高的元素先出佇...

NYOJ284坦克大戰

bfs求最短路,這個題走到 b 點是要花費2個時間,e 是1個時間,所以要用乙個優先佇列,優先順序就是花費小的先出隊,其餘的就是模板了。include include include using namespace std define inf 0x3f3f3f3f int stx,sty int ...

EOJ 莫干山奇遇

出題人當然是希望出的題目有關oxx,於是想方設法給題目配上一些有關oxx的背景故事,使得它看起來不那麼無趣。但有的時候卻無法引入合適的小姐姐,使得oxx顯得非常可憐。所以出題人刪除了故事,只留下乙個枯燥乏味的數學問題。故事已刪除 給乙個長度為n的序列a1,a2,an,求乙個長度為m的序列b1,b2,...