九度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
- 九度OJ 1103 二次方程计算器
- 九度oj 题目1103:二次方程计算器
- 九度OJ 1103 二次方程计算器
- 九度 oj 题目1103:二次方程计算器
- 九度OJ-1103:二次方程计算器
- 九度OJ 1103:二次方程计算器 (解方程)
- 九度 1103:二次方程计算器
- 九度[1103]-二次方程计算器
- 九度 Online Judge 算法 刷题 题目1103:二次方程计算器
- 题目1103:二次方程计算器
- jobdu 1103 二次方程计算器
- 题目1103:二次方程计算器
- 九度OJ 1019 简单计算器
- 九度oj 题目1019:简单计算器
- 九度oj-1019:简单计算器
- 九度OJ-题目1019:简单计算器
- 九度oj-1019-简单计算器
- 九度OJ 1019:简单计算器
- 简单dp,first wrong POJ 3616 Milking Time
- 排序--3.选择
- Python 序列化之 ProtoBuf
- 将一个数组拆分成两个数组,两个数组的差的绝对值最小
- Linux命令(一)
- 九度OJ-1103:二次方程计算器
- C++ 学习之旅
- Good morning [字符串]
- 浅谈物理地址、虚拟地址和逻辑地址
- 51单片机的IO端口
- todolistl
- Java 基础随笔
- webpack使用(一)
- Shrio学习总结(三)--自定义Realm以及连接数据库Realm