题目要求:
解方程,给定一个字符串,代表一个一元一次方程。如果有解求解,输出格式“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; //别忘了要*flag
i++;
}else
con+=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++;
}else
con+=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;
}