题目要求:
解方程,给定一个字符串,代表一个一元一次方程。如果有解求解,输出格式“x=数字“,如果解的个数无穷,输出 “infinite solutions”。如果没有解输出“no solution”
字符串长度不超过 256 。样例:
输入:
10x-2x-8=4x+7+x
输出:
x=5
思路:
1.解题原则,解题步骤中应当尽量减少逻辑思考,可以多设置几个参数,数组。简化思考与处理问题的复杂度。
2.模拟题,字符串形式读入后,逐个字符处理。设置coe,con分别表示x的系数和常数, 进行累加,注意x前系数为+1和-1时要能够正确处理,另外若表达式最后是数字,注意地址越界问题。
4.参考输入
x-x+2=0------->输出:no solution
2x-1=x+3------->输出:x=4
2x-2x-1+1=0---------输出:infinite solutions
2x-4x+8-4+x=-x+2x-1+9-------->输出:x=-2
参考代码:
#include<cstdio>#include<iostream>#include<string>using namespace std;int main(){string s;int coe=0,con=0,tag=1;//tag标记在等号左边还是右边getline(cin,s);int i=0;while(i<s.size()){if(s[i]=='-'||s[i]=='+'){int t=0,flag=1;//flag标记直接碰到-x和x的情况if(s[i]=='-') flag=-1;i++;while(i<s.size()&&s[i]>='0'&&s[i]<='9'){t=t*10+s[i]-'0';i++;}if(i<s.size()&&s[i]=='x'&&t==0) { //x前系数是1的情况coe+=flag*tag;i++;}else if(i<s.size()&&s[i]=='x'){coe+=t*flag*tag;//别忘了要*flagi++;}elsecon+=t*flag*tag;//t*flag}else if(s[i]>='0'&&s[i]<='9'){int t=0;while(i<s.size()&&s[i]>='0'&&s[i]<='9'){t=t*10+s[i]-'0';i++;}if(i<s.size()&&s[i]=='x') { //要加上i<边界,否则最后一个字符是常数会越界异常coe+=t*tag;i++;}elsecon+=t*tag;}else if(s[i]=='x'){coe+=tag;i++;}else if(s[i]=='='){tag=-1;i++;}}if(coe==0&&con==0) printf("infinite solutions\n");else if(coe!=0&&con%coe==0) printf("x=%d\n",-con/coe);else printf("no solution\n");return 0;}
优化:
1.改用a,b两个变量代表系数和常数。
2.使用一个while()循环处理整个等式。
参考代码:
#include<cstdio> #include<string>#include<iostream>using namespace std;string str;int main(){cin>>str;int a=0,b=0,sym=1,i=0,flag=1;//sym表示符号,flag=1表示等式左边,flag=-1表示等式右边while(i<str.size()) {if(str[i]=='=') { flag=-1;sym=1;} //遇到等号时,sym置1规避之前的影响else if(str[i]=='+') sym=1;else if(str[i]=='-') sym=-1;else {int t=0;while(i<str.size()&&str[i]>='0'&&str[i]<='9'){t=10*t+(str[i]-'0');++i;}if(i>=str.size()) {b-=t*sym;break;} //当表达式最后是数字时单独判断,如4x-1=2x+3,否则会越界 if(str[i]=='x'&&t==0) a+=sym*flag; //x前系数为正负1时单独判断处理else if(str[i]=='x') a+=t*sym*flag; //处理系数else {b+=t*sym*flag;continue;} //处理常数}++i;}if(a==0&&b==0) printf("infinite solutions\n");else if(a!=0&&b%a==0) printf("x=%d\n",-b/a);else printf("no solution\n");return 0;}