2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 复旦大学计算机硕士招生复试上机题(2)-解一元一次方程

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

时间:2018-11-15 16:33:24

相关推荐

复旦大学计算机硕士招生复试上机题(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;//别忘了要*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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。