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
思路(總感覺用洛谷寫題解好些。。。)
未知數的值=常數和/係數和
不過有很多細節需要注意。
解釋在**:
#include
#include
#include
using
namespace
std;
char wzs;//未知數
int i,jsg,zs,xs,m;//zs:常數和,xs:係數和,m:符號開始的位置,用於求係數,jsg:判斷是否出現過符號
short b=1;//等號左邊還是右邊
bool ok[256];//判斷當前位數是否是未知數
double ans=0;char c[256];
void
qxs(int n)
//這個是求上乙個符號到當前未知數之間的數,也就是這個未知數的係數
//如果是+,把係數加進去
if (c[j]=='-') //是-就減
}if (jg)
xs+=k*b;//特判
}void
js()
//存好符號的開始位置,並標記已出現符號
if (c[i]=='=') //如果在等號右邊,需要變號
if (c[i]==wzs) //如果這個是未知數
if (c[i-1]=='+'||c[i-1]=='='||i==0)//這裡解釋一下,如果它是第乙個未知數,且前面不是負號(前面已經排除),它的係數就是一;如果是等於號後面的第乙個未知數,它的係數也等於1
qxs(i);//如果係數不是1或-1}}
}void
qzs()
//求常數(拼音打錯了,見諒。。。)
//如果它是未知數的係數,那麼將k清0並跳過
if (c[i]<'0'||c[i]>'9') //如果它不是數,也就是是+,-或=號
//如果在等號右邊,所有的符號都會顛倒;fh重新變成+
}else k=k*10+c[i]-48;//否則將此數存下來
}zs+=k*fh*dh;//最後一次特殊處理,因為可能還有
}int
main
() wzs=c[i];//未知數
js();//求係數
qzs();//求常數
zs*=-1;//這裡解釋一下:因為我們求出的所有的值都在等號左邊,所以需要把其中一項移到右邊,根據移項變號的原理,所以要乘-1
ans=(double)zs/xs;ans*=1000;ans=floor(ans+0.5);ans/=1000.0;//四捨五入,c++是直接舍尾,所以我們先乘1000,再加0.5,之後取整,最後在除以1000就可以達到保留三位整數的目的了
printf("%c=%0.3lf",wzs,ans);//輸出
}
計算器的改良
在codevs上遇到乙個挺新穎的題目,設計演算法解一元一次方程。ncl是一家專門從事計算器改良與公升級的實驗室,最近該實驗室收到了某公司所委託的乙個任務 需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了乙個剛進入的新手zl先生。為了很好的完成這個任務,zl先生首先研究了一...
計算器的改良
2000年分割槽聯賽普級組之一 計算器的改良 time limit 1000ms memory limit 65536k total submit 179 accepted 75 description ncl是一家專門從事計算器改良與公升級的實驗室,最近該實驗室收到了某公司所委託的乙個任務 需要在...
1015 計算器的改良
題目描述 description ncl是一家專門從事計算器改良與公升級的實驗室,最近該實驗室收到了某公司所委託的乙個任務 需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了乙個剛進入的新手zl先生。為了很好的完成這個任務,zl先生首先研究了一些一元一次方程的例項 4 3x...