OJ_1103 二次方程计算器

本文介绍了一个二次方程计算器的设计与实现。该计算器能够解析输入的二次方程,并通过栈来处理方程的不同部分,最终计算出方程的解。文章还提供了一个示例程序,演示了如何处理各种输入情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <string>
#include <math.h>
#include <iomanip>
#include <stack>
using namespace std;
int getnum(string s,int &i)
{
    int sum=0;
    while(s[i]>='0'&&s[i]<='9')
    {
                               sum=sum*10+s[i]-'0';
                               i++;
    }
    return sum;
}
void func()
{
     string s;
     while(cin>>s)
     {
                  int flag=1;
                  int a,b,c;
                  a=b=c=0;
                  stack<int> st;
                  for(int i=0;i<s.size();)
                  {
                          if(s[i]>='0'&&s[i]<='9')// 数字先存下来 
                          {
                                                  int t=getnum(s,i);
                                                  st.push(flag*t);
                          }else
                          if(s[i]=='x'&&s[i+1]=='^')// 二次项 
                          {
                                                       // 系数没有数字,即为1的情况 
                                                    if(s[i-1]<'0'||s[i-1]>'9')
                                                    {
                                                                              st.push(flag);
                                                    }
                                                    int t=st.top();
                                                    st.pop();
                                                    a+=t;
                                                    i++;//^
                                                    i++;//2
                                                    i++;// 下一个符号 
                          }else
                          if(s[i]=='x'&&s[i+1]!='^')// 一次项
                          {
                                                          // 系数没有数字,即为1的情况 
                                                    if(s[i-1]<'0'||s[i-1]>'9')
                                                    {
                                                                              st.push(flag);
                                                    }
                                                    int t=st.top();
                                                    st.pop();
                                                    b+=t;


                                                    i++;// 下一个符号 
                          }else
                          if(s[i]=='+')
                          {
                                       flag=1;
                                       i++;
                          }else
                          if(s[i]=='-')
                          {
                                       flag=-1;
                                       i++;
                          } else
                          if(s[i]=='=')
                          {
                                       int tmp=0;
                                       while(!st.empty())
                                      {
                                                 tmp+=st.top();
                                                 st.pop();       
                                      }
                                      c+=tmp;
                                       a=0-a;
                                       b=0-b;
                                       c=0-c;
                                       i++;
                          }
                          
                          
                  }
                 int tmp=0;
                 while(!st.empty())
                 {
                            tmp+=st.top();
                            st.pop();       
                 }
                 c+=tmp;
                 
                 if(a<0)
                 {
                                       a=0-a;
                                       b=0-b;
                                       c=0-c;
                 
                 }
                 
                 double x1,x2;
                 double delta=b*b-4*a*c;
                 if(delta<0)
                 cout<<"No Solution"<<endl;
                 else{
                      
                
                 x1=((-1)*(double)b-sqrt(delta))/a/2;
                 x2=((-1)*(double)b+sqrt(delta))/a/2;
                 cout.setf(ios::fixed);
                 cout.precision(2);
                 cout<<x1<<" "<<x2<<endl;
                 }                    
                                      
                  
                  
     }
}
int main(int argc, char *argv[])
{
    
	//printf("Hello, world\n");
	func();
	return 0;
}

使用栈,同时要注意一些表达式上的细节

1.=号左右两边的问题

2.没有系数的情况实际上是系数为1


题目描述:

设计一个二次方程计算器

输入:

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

输出:

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

样例输入:
x^2+x=3x+4
样例输出:
-1.24 3.24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值