NOIP 2000 计算器的改良
程序员文章站
2022-08-28 11:11:01
题面 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。 为了很好的完成这个任务,ZLZL先生首先研究了一些一元一次方程的实例: 4+3x=84+3x=8 6a ......
题面
ncl是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手zl先生。
为了很好的完成这个任务,zlzl先生首先研究了一些一元一次方程的实例:
4+3x=84+3x=8
6a-5+1=2-2a6a−5+1=2−2a
-5+12y=0−5+12y=0
zl先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
输入输出格式
输入格式:
一个一元一次方程。
输出格式:
解方程的结果(精确至小数点后三位)。
样例
6a-5+1=2-2a
a=0.750
思路
本题打得我心态爆炸,我的思路是把字符串分为a(等号左边),b(等号右边)来计算。一开始先判断a的开头有没有减号,如果没有就加上加号,对b也一样。然后就是瞎jb用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 { 8 cin>>s; 9 int n=s.size(); 10 for (i=0;i<=n;i++) if (s[i]>='a'&&s[i]<='z'&&s[i]!='=') {wzs=s[i];break;} 11 //cout<<wzs<<endl; 12 a=s.substr(0,s.find("=")); 13 b=s.substr(s.find("=")+1,n-s.find("=")); 14 if (a[0]!='-') a='+'+a; 15 if (b[0]!='-') b='+'+b; 16 //cout<<a<<endl; 17 for (i=1;i<=a.size();i++) 18 { 19 if (a[i-1]=='+') 20 { 21 for (j=i;j<=a.size();j++) if (a[j+1]=='-'||a[j+1]=='+') break; 22 string tmp=a.substr(i,j-i+1); 23 //cout<<tmp<<endl; 24 if ((int)tmp.find(wzs)!=-1) 25 { 26 x=tmp.substr(0,tmp.find(wzs)); 27 if (x=="") x="1"; 28 y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1); 29 //cout<<x<<" "<<y<<endl; 30 stringstream trans; 31 trans<<x; 32 int ans; 33 trans>>ans; 34 weizhi+=ans; 35 } 36 else 37 { 38 stringstream trans; 39 trans<<tmp; 40 int ans; 41 trans>>ans; 42 //cout<<ans<<endl; 43 num-=ans; 44 } 45 i=j; 46 } 47 if (a[i-1]=='-') 48 { 49 for (j=i;j<=a.size();j++) if (a[j+1]=='-'||a[j+1]=='+') break; 50 string tmp=a.substr(i,j-i+1); 51 //cout<<tmp<<endl; 52 if ((int)tmp.find(wzs)!=-1) 53 { 54 x=tmp.substr(0,tmp.find(wzs)); 55 if (x=="") x="1"; 56 y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1); 57 //cout<<x<<" "<<y<<endl; 58 stringstream trans; 59 trans<<x; 60 int ans; 61 trans>>ans; 62 weizhi-=ans; 63 } 64 else 65 { 66 stringstream trans; 67 trans<<tmp; 68 int ans; 69 trans>>ans; 70 //cout<<ans<<endl; 71 num+=ans; 72 } 73 i=j; 74 } 75 } 76 /*右边*/ 77 //cout<<b<<endl; 78 for (i=1;i<=b.size();i++) 79 { 80 if (b[i-1]=='+') 81 { 82 for (j=i;j<=b.size();j++) if (b[j+1]=='-'||b[j+1]=='+') break; 83 string tmp=b.substr(i,j-i+1); 84 //cout<<tmp<<endl; 85 if ((int)tmp.find(wzs)!=-1) 86 { 87 x=tmp.substr(0,tmp.find(wzs)); 88 if (x=="") x="1"; 89 y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1); 90 //cout<<x<<" "<<y<<endl; 91 stringstream trans; 92 trans<<x; 93 int ans; 94 trans>>ans; 95 weizhi-=ans; 96 } 97 else 98 { 99 stringstream trans; 100 trans<<tmp; 101 int ans; 102 trans>>ans; 103 //cout<<ans<<endl; 104 num+=ans; 105 } 106 i=j; 107 } 108 if (b[i-1]=='-') 109 { 110 for (j=i;j<=b.size();j++) if (b[j+1]=='-'||b[j+1]=='+') break; 111 string tmp=b.substr(i,j-i+1); 112 //cout<<tmp<<endl; 113 if ((int)tmp.find(wzs)!=-1) 114 { 115 x=tmp.substr(0,tmp.find(wzs)); 116 if (x=="") x="1"; 117 y=tmp.substr(tmp.find(wzs),tmp.size()-tmp.find(wzs)+1); 118 //cout<<x<<" "<<y<<endl; 119 stringstream trans; 120 trans<<x; 121 int ans; 122 trans>>ans; 123 weizhi+=ans; 124 } 125 else 126 { 127 stringstream trans; 128 trans<<tmp; 129 int ans; 130 trans>>ans; 131 //cout<<ans<<endl; 132 num-=ans; 133 } 134 i=j; 135 } 136 } 137 cout<<wzs<<"="; 138 if ((double)num/weizhi==-0.000) cout<<"0.000"<<endl; 139 else printf("%.3lf",(double)num/weizhi); 140 //cout<<weizhi<<" "<<num<<endl; 141 return 0; 142 }