2018复旦大学计算机硕士招生复试上机题(2)-解一元一次方程

 

题目要求:

    解方程,给定一个字符串,代表一个一元一次方程。如果有解求解,输出格式“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
#include
#include
using namespace std;
int main()
{
	string s;
	int coe=0,con=0,tag=1;	//tag标记在等号左边还是右边
	getline(cin,s);
	int i=0;
	while(i='0'&&s[i]<='9'){
				t=t*10+s[i]-'0';
				i++;
			}
			if(i='0'&&s[i]<='9'){
			int t=0;		
			while(i='0'&&s[i]<='9'){
				t=t*10+s[i]-'0';
				i++;
			}
			if(i

 

优化:

1.改用a,b两个变量代表系数和常数。

2.使用一个while()循环处理整个等式。

 

参考代码:

#include  
#include
#include
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='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;
}

 

你可能感兴趣的:(字符串处理,模拟)