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<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;
}

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值