上交大 2011 二次方程计算器

题目:
输入关于x的二次方程表达式(系数为整数),输出两个解(由小到大输出,保留两位小数);如果无解,则输出“No Solution”。

思路:
先确定等号位置,分成左右两个字符串,从中分别提取系数,再综合。然后求解。
提取系数的过程如图:

过程:
介绍两个函数:
atoi()函数可以识别"+""-"号,并正确转化成int。

string str="-2980";
string s="+12";
cout<<atoi(str.c_str())<<endl;
cout<<atoi(s.c_str())<<endl; 

substr(int begin,int len)函数表示截取从begin开始的长尾len的string返回(若没第二个参数,则取到尾)。

string str="Ihaveapen!";
string s=str.substr(2,5);

此次调试用了很久:
现象为:遇到questXishu()函数,调试就卡在那里,运行也是(出不来结果,也程序也一直没结束)。OJ显示"Time Limit Exceed"。
后来才发现不是函数卡住,而是一直在运行,而且在死循环(判断二次项时,str[i+1]==‘^‘不小心写成str[i]==‘^‘)。

代码:

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <string>
  4 #include <cstring>
  5 #include <cstdlib>
  6 #include <cmath>
  7 using namespace std;
  8
  9 //求取等式的系数。str为式子,系数提取到a数组
 10 void questXishu(string str,int *a);
 11
 12 int main(){
 13     string str;                   //str:式子,s:数字字串
 14     string sL,sR;                 //等号左右字串
 15     int len,i;                    //式子长度
 16     int xiShuL[3],xiShuR[3],deTa; //分别为常数,一次,二次的系数
 17     double x1,x2;                 //解
 18
 19     while(cin>>str){              //输入式子
 20         memset(xiShuL,0,3*sizeof(int)); //系数数组清空
 21         memset(xiShuR,0,3*sizeof(int)); //系数数组清空
 22         len=str.length();               //字符串长度
 23         for(i=0;i<len;i++){             //找到等号位置
 24             if(str[i]==‘=‘)
 25                 break;
 26         }
 27         sL=str.substr(0,i);             //截取等号左右字串
 28         sR=str.substr(i+1);
 29
 30
 31         questXishu(sL,xiShuL);          //求取左右式的系数
 32         questXishu(sR,xiShuR);
 33
 34         xiShuL[0]=xiShuL[0]-xiShuR[0];  //计算最终系数
 35         xiShuL[1]=xiShuL[1]-xiShuR[1];
 36         xiShuL[2]=xiShuL[2]-xiShuR[2];
 37                                         //计算并输出解
 38         if((deTa=(xiShuL[1]*xiShuL[1]-4*xiShuL[2]*xiShuL[0]))>=0){
 39             x1=(-xiShuL[1]-sqrt(deTa/1.0))/(2.0*xiShuL[2]);
 40             x2=(-xiShuL[1]+sqrt(deTa/1.0))/(2.0*xiShuL[2]);
 41             if(x1>x2)
 42                 printf("%.2lf %.2lf\n",x2,x1);
 43             else
 44                 printf("%.2lf %.2lf\n",x1,x2);
 45         }
 46         else
 47             printf("No Solution\n");
 48     }
 49     return 0;
 50 }
 51
 52 //求取等式的系数。str为式子,系数提取到a数组
 53 void questXishu(string str,int *a){
 54     int len=str.length(),i=0;
 55     string s="";                   //用来放系数串
 56     while(i<len){                  //遍历
 57         if(str[i]==‘+‘ || str[i]==‘-‘){  //遇到+/-号:后面一定跟着系数
 58                                                //常数项要么:1.后面跟着+/-号,2.要么放在串最后
 59             if(s!=""){                         //此处是情况1:常数项后跟着+/-号。若有常数项未处理,则处理下常数项
 60                 a[0]+=atoi(s.c_str());                       //加入常数项系数
 61                 s="";                                //s恢复为空
 62             }
 63             s+=str[i];                         //记下符号
 64             i++;
 65             continue;
 66         }
 67                                          //遇到数字:为系数,记录下来
 68         while(i<len && ‘0‘<=str[i] && str[i]<=‘9‘){
 69             s+=str[i];
 70             i++;
 71         }
 72         if(i>=len)                       //从数字循环退出原因若为i>len,则str遍历结束,退出
 73             break;
 74
 75         if(str[i]==‘x‘){                 //遇到字符x
 76             if((i+1)<len && str[i+1]==‘^‘){    //还有下一位,且为^:二次项
 77                 if(s=="" || s=="+")                  //处理系数为+/-1的情况
 78                     s="1";
 79                 else{
 80                     if(s=="-")
 81                         s="-1";
 82                 }
 83                 a[2]+=atoi(s.c_str());                       //数字加入二次项系数
 84                 s="";                                 //s恢复为空
 85                 i=i+3;                               //跳到下下下位
 86             }
 87             else{                              //其他情况:一次项
 88                 if(s=="" || s=="+")                  //处理系数为+/-1的情况
 89                     s="1";
 90                 else{
 91                     if(s=="-")
 92                         s="-1";
 93                 }
 94                 a[1]+=atoi(s.c_str());                       //数字加入一次项系数
 95                 s="";                                 //s恢复为空
 96                 i=i+1;                               //跳到下位
 97             }
 98         }
 99     }
100     if(s!=""){                     //常数项情况2:放在串最后。循环内未来得及处理。
101         a[0]+=atoi(s.c_str());
102     }
103 }
时间: 2024-11-14 08:52:03

上交大 2011 二次方程计算器的相关文章

九度oj 题目1103:二次方程计算器

题目描述: 设计一个二次方程计算器 输入: 每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式. 输出: 每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”. 样例输入: x^2+x=3x+4 样例输出: -1.24 3.24 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorit

1103.二次方程计算器

题目描述: 设计一个二次方程计算器 输入: 每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式. 输出: 每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出"No Solution". 样例输入: x^2+x=3x+4 样例输出: -1.24 3.24 #include<iostream> #include<cstring> #include<cmath> #include<iomanip&g

九度[1103]二次方程计算器

1 # include<iostream> 2 # include<string> 3 # include<iomanip> 4 # include<cmath> 5 using namespace std; 6 int a=0,b=0,c=0; 7 void getPar(string s,int flag) 8 { 9 if(s=="0") return ; 10 int l=s.size(); 11 bool neg=true; 1

快速进入Android世界(上)

Android概述 Android是什么 Android是一种以Linux为基础的开放源码操作系统和应用程序,主要使用于便携设备. Android操作系统最初由Andy Rubin开发,最初主要支持手机. 2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上. 2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一. 2011年11月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为58%. And

【留念贴】Android开发——计算器

[过程] 在电商学霸&&代码女神XuFei的影响下,接触到了关于Android客户端的一些开发,第一次在Android平台搞出了一个App,真的是激动不已,所以必须开个留念贴记录一下. 本来准备一晚上搞定计算器的,但是当我看到那些天花乱坠的语法,简直蛋碎!最终吃起了烧烤....下起了飞行棋....五子棋....还被虐!!....T T 第二天又看了一下ChenYong的代码,感觉可以写了,理论上能做出来,但是没有装编译器.....因此花一晚上的时间去装.....终于跑起来了....但是不知

C#实现日历样式的下拉式计算器

C#实现日历样式的下拉式计算器 原文地址:http://developer.51cto.com/art/201508/487486.htm 如果我们正在做一个类似于库存控制和计费系统的项目,有些部分可能必须手动计算数值.因此,用户就不得不使用计算器得到结果,再填入到输入字段中,或者在工作窗口上单独打开一个计算器窗口.总之,各种不便和麻烦. 本文介绍了如何在Visual Studio中创建用户控件来显示下拉式计算器,弹出效果类似于日历控件. 介绍 如果我们正在做一个类似于库存控制和计费系统的项目,

利用C++日期类实现简单的日期计算器

网络上有一个日期计算器可以通过输入的日期来计算天数,或者通过日期加减天数来计算出相应的日期.这个小工具对在我们生活中还是非常有用的,它的代码实现是不是很难呢?其实用我们学习过的C++类来处理问题就变得很简单了. 参考代码:(加强版) #include<iostream> #include<cstdlib> using namespace std; class Date { public: Date(int year=1900,int month=1,int day=1)//构造函数

selenium验证车贷计算器算法

1.验证页面上的车贷计算器算的结果是否与需求中给的公式结果一致. 页面图片: 代码如下(简单实现,需要优化): package com.test; import java.math.BigDecimal; import org.junit.Assert; import org.openqa.selenium.By; import org.testng.Reporter; import org.testng.annotations.AfterClass; import org.testng.ann

小米3系统计算器自定义开关控件-MySwitchView

1.前言 在android4.0以后,有switch控件,类似于iPhone上面滑块的效果,但是只能用在4.0以后的系统中,之前的平台,就无法使用这种控件.近段时间,看到了小米3手机上自带的计算器app,有这样的效果,上面的一个控件,觉得很漂亮,并且与iPhone上的效果略有不同,于是自己动手编写了一下这个功能,在编写的过程中,参考过网上的一些demo,运行后,在控件滑动的时候,感觉动画不平滑,有卡顿的现象,反复修改,最后还是有一些问题,感觉是在滑动中的状态,没有合理的控制好.无奈只能参考Goo