NOIP 2000 計算器的改良
題面
NCL 是一家專門從事計算器改良與升級的實驗室,最近該實驗室收到了某公司所委託的一個任務:需要在該公司某型號的計算器上加上解一元一次方程的功能。實驗室將這個任務交給了一個剛進入的新手ZL先生。
為了很好的完成這個任務, ZL ZL先生首先研究了一些一元一次方程的例項:
4+3x=8 4 + 3 x =8
6a-5+1=2-2a 6 a − 5 + 1 = 2 − 2a
-5+12y=0 − 5 + 1 2 y =0
ZL 先生被主管告之,在計算器上鍵入的一個一元一次方程中,只包含整數、小寫字母及+、-、=這三個數學符號(當然,符號“-”既可作減號,也可作負號)。方程中並沒有括號,也沒有除號,方程中的字母表示未知數。
你可假設對鍵入的方程的正確性的判斷是由另一個程式員在做,或者說可認為鍵入的一元一次方程均為合法的,且有唯一實數解。
輸入輸出格式
輸入格式:
一個一元一次方程。
輸出格式:
解方程的結果(精確至小數點後三位)。
樣例
6a-5+1=2-2a 輸入
a=0.750 輸出
思路
本題打得我心態爆炸,我的思路是把字串分為a(等號左邊),b(等號右邊)來計算。一開始先判斷a的開頭有沒有減號,如果沒有就加上加號,對b也一樣。然後就是
用substr擷取係數和未知數,用stringstream把字串轉為數字(如“123”轉為123)
記得判-0.000 (C++裡實數型如果0除以一個負數得-0,害得我浪費一次下載資料機會)
程式碼
略長勿噴
1 #include<bits/stdc++.h> 2 using namespace std; 3 string s,a,b,x,y; 4 char wzs; 5 int weizhi,num,i,j; 6 int main() 7 { 8cin>>s; 9int n=s.size(); 10for (i=0;i<=n;i++) if (s[i]>='a'&&s[i]<='z'&&s[i]!='=') {wzs=s[i];break;} 11//cout<<wzs<<endl; 12a=s.substr(0,s.find("=")); 13b=s.substr(s.find("=")+1,n-s.find("=")); 14if (a[0]!='-') a='+'+a; 15if (b[0]!='-') b='+'+b; 16//cout<<a<<endl; 17for (i=1;i<=a.size();i++) 18{ 19if (a[i-1]=='+') 20{ 21for (j=i;j<=a.size();j++) if (a[j+1]=='-'||a[j+1]=='+') break; 22string tmp=a.substr(i,j-i+1); 23//cout<<tmp<<endl; 24if ((int)tmp.find(wzs)!=-1) 25{ 26x=tmp.substr(0,tmp.find(wzs)); 27if (x=="") x="1"; 28y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1); 29//cout<<x<<" "<<y<<endl; 30stringstream trans; 31trans<<x; 32int ans; 33trans>>ans; 34weizhi+=ans; 35} 36else 37{ 38stringstream trans; 39trans<<tmp; 40int ans; 41trans>>ans; 42//cout<<ans<<endl; 43num-=ans; 44} 45i=j; 46} 47if (a[i-1]=='-') 48{ 49for (j=i;j<=a.size();j++) if (a[j+1]=='-'||a[j+1]=='+') break; 50string tmp=a.substr(i,j-i+1); 51//cout<<tmp<<endl; 52if ((int)tmp.find(wzs)!=-1) 53{ 54x=tmp.substr(0,tmp.find(wzs)); 55if (x=="") x="1"; 56y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1); 57//cout<<x<<" "<<y<<endl; 58stringstream trans; 59trans<<x; 60int ans; 61trans>>ans; 62weizhi-=ans; 63} 64else 65{ 66stringstream trans; 67trans<<tmp; 68int ans; 69trans>>ans; 70//cout<<ans<<endl; 71num+=ans; 72} 73i=j; 74} 75} 76/*右邊*/ 77//cout<<b<<endl; 78for (i=1;i<=b.size();i++) 79{ 80if (b[i-1]=='+') 81{ 82for (j=i;j<=b.size();j++) if (b[j+1]=='-'||b[j+1]=='+') break; 83string tmp=b.substr(i,j-i+1); 84//cout<<tmp<<endl; 85if ((int)tmp.find(wzs)!=-1) 86{ 87x=tmp.substr(0,tmp.find(wzs)); 88if (x=="") x="1"; 89y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1); 90//cout<<x<<" "<<y<<endl; 91stringstream trans; 92trans<<x; 93int ans; 94trans>>ans; 95weizhi-=ans; 96} 97else 98{ 99stringstream trans; 100trans<<tmp; 101int ans; 102trans>>ans; 103//cout<<ans<<endl; 104num+=ans; 105} 106i=j; 107} 108if (b[i-1]=='-') 109{ 110for (j=i;j<=b.size();j++) if (b[j+1]=='-'||b[j+1]=='+') break; 111string tmp=b.substr(i,j-i+1); 112//cout<<tmp<<endl; 113if ((int)tmp.find(wzs)!=-1) 114{ 115x=tmp.substr(0,tmp.find(wzs)); 116if (x=="") x="1"; 117y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1); 118//cout<<x<<" "<<y<<endl; 119stringstream trans; 120trans<<x; 121int ans; 122trans>>ans; 123weizhi+=ans; 124} 125else 126{ 127stringstream trans; 128trans<<tmp; 129int ans; 130trans>>ans; 131//cout<<ans<<endl; 132num-=ans; 133} 134i=j; 135} 136} 137cout<<wzs<<"="; 138if ((double)num/weizhi==-0.000) cout<<"0.000"<<endl; 139else printf("%.3lf",(double)num/weizhi); 140//cout<<weizhi<<" "<<num<<endl; 141return 0; 142 }