一道多項式的題目,我寫了好久,一直在嘗試修改,寫到最後整個人渾渾噩噩的,最後**寫了好長。不說了,說多了都是淚。。。。。。
單點時限: 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,...