九度OJ-1103:二次方程计算器

来源:互联网 发布:mac如何删除word软件 编辑:程序博客网 时间:2024/05/18 00:32

  费了一番功夫。采取了拆分多项式逐项处理的方法。编写了一个项处理函数,将字符串拆分成一个个项,逐个处理,提取出左式跟右式的系数做差,然后利用求根公式。

Debug记录:

①条件判等写成了赋值

②项处理函数中在使用sum之前忘了初始化

③编写项处理函数时没有考虑到减号的情况

④对系数数组应该采取累加的方式,以应对多个同阶项的情况

题目描述:

设计一个二次方程计算器

输入:

每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。

输出:

每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。

样例输入:
x^2+x=3x+4
样例输出:
-1.24 3.24
来源:
2011年上海交通大学计算机研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7826-1-1.html
#include <cstdio>#include <cstring>#include <cmath>#define MAXSIZE 50#define EPS 0.000001using namespace std;double a[3],b[3],c[3];void dealItem(char *str,int order) {//进来的项存储在str中,必须带+-号 bool pos; int len=strlen(str);int haveX=-1,haveBul=-1;double temp,sum;//符号处理pos=str[0]=='+'?true:false;for (int i=1;i<len;i++){if (str[i]=='x')/*bug= ==*/haveX=i;if (str[i]=='^')haveBul=i;} if (haveX>=0){//一次项或二次项 if (haveX==1){//系数为1 sum=1; }else{//系数不为1 sum=0;for (int i=1;i<haveX;i++){sum*=10;sum+=str[i]-'0';}}if (haveBul>0){//二次项 a[order]+=pos?sum:-sum;}else{//一次项 b[order]+=pos?sum:-sum;}}else{//常数项 sum=0;/*bug忘写*/for (int i=1;i<len;i++){sum*=10;sum+=str[i]-'0';}c[order]+=pos?sum:-sum;}}int main(){char str[MAXSIZE],strTemp[MAXSIZE];double delta;double x1,x2;int len;int p,q;while (scanf("%s",str)!=EOF){//initiatefor (int i=0;i<3;i++){//初始化系数阵列为0 假设都为0 a[i]=b[i]=c[i]=0;}len=strlen(str);strTemp[0]='\0';//processp=-1;//p在str上走 while (p<len) {//处理左式 q=0;//q在strTemp上走 //该项符号处理 if (p==-1||str[p]=='='){//在多项式首部的情况 p++;if (str[p]=='-'||str[p]=='+'){//若该项自带符号 strTemp[q]=str[p];p++;q++;}else{//若该项不带符号 strTemp[q]='+';q++;}} else{//不在多项式首部 则录入符号 strTemp[q]=str[p];p++;q++;}//处理项的绝对值部分 for (;str[p]!='+'&&str[p]!='='&&str[p]!='\0'&&str[p]!='-';p++){//copy a item strTemp[q]=str[p];q++;}strTemp[q]='\0';dealItem(strTemp,1);if (str[p]=='='){break;}}while (p<len){//处理右式 q=0;//q在strTemp上走 //该项符号处理 if (p==-1||str[p]=='='){//在多项式首部的情况 p++;if (str[p]=='-'||str[p]=='+'){//若该项自带符号 strTemp[q]=str[p];p++;q++;}else{//若该项不带符号 strTemp[q]='+';q++;}} else{//不在多项式首部 则录入符号 strTemp[q]=str[p];p++;q++;}for (;str[p]!='+'&&str[p]!='='&&str[p]!='\0'&&str[p]!='-';p++){//copy a item strTemp[q]=str[p];q++;}strTemp[q]='\0';dealItem(strTemp,2);}//cala[0]=a[1]-a[2];b[0]=b[1]-b[2];c[0]=c[1]-c[2];delta=b[0]*b[0]-4*a[0]*c[0];if (delta<0){printf("No Solution\n");}else{x1=(-sqrt(delta)-b[0])/2/a[0];x2=(sqrt(delta)-b[0])/2/a[0];printf("%.2lf %.2lf\n",x1,x2);}}return true;}/*bug1.没考虑减号的情况 2.系数应该使用+=sum,以防多个同阶项的情况 */


1 0