NCL是一家專門從事計算器改良與升級的實驗室,最近該實驗室收到了某公司所委託的一個任務:需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了一個剛進入的新手ZL先生。爲了很好的完成這個任務,ZL先生首先研究了一些一元一次方程的實例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在計算器上鍵入的一個一元一次方程中,只包含整數、小寫字母及+、-、=這三個數學符號(當然,符號“─”既可作減號,也可作負號)。方程中並沒有括號,也沒有除號,方程中的字母表示未知數。
編寫程序,解輸入的一元一次方程, 將解方程的結果(精確至小數點後三位)輸出至屏幕。
你可假設對鍵入的方程的正確性的判斷是由另一個程序員在做,或者說可認爲鍵入的一元一次方程均爲合法的,且有唯一實數解。
一個一元一次方程
方程的解
6a-5+1=2-2a
a=0.750
注意加減號都是半角
一開始覺得好難啊,後面發現模擬計算等號左右的係數和常數,發現也可以做
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
const int maxn = 5;
int pos,n[maxn],u[maxn],lr=0,k;
double l=0,r=0;
string s;
void cal(bool sign);
int main(){
freopen("Text.txt","r",stdin);
while(cin>>s){
k=0;
while(k<s.size()){
if(s[k]=='-'){
k++;
cal(1);
}
else if(s[k]=='+'){
k++;
cal(0);
}
else{
if(s[k]=='='){
k++;
lr=1;
continue;
}
cal(0);
}
}
l=n[0]-n[1];
r=u[1]-u[0];
//cout<<n[0]<<" "<<n[1]<<endl;
//cout<<l<<" "<<r<<endl;
cout.setf(ios::fixed);
double ans=l/r;
if(ans>0)ans+=0.0005;
else ans -= 0.0005;
cout<<setprecision(3)<<s[pos]<<" = "<< ans <<endl;
//printf("%.3lf",l/r+0.0005);
}
return 0;
}
void cal(bool sign){
//cout<<"k = "<<k<<endl;
//cout<<s[k]<<endl;
bool flag=0;
int tal=0;
while(s[k]>='0'&&s[k]<='9'){
flag=1;
tal=tal*10+s[k]-'0';
k++;
}
if(sign)tal=-tal;
if(!flag)tal=1;
if(s[k]>='a'&&s[k]<='z'){
pos=k;
u[lr]+=tal;
k++;
}
else{
n[lr]+=tal;
}
}