题目1103:二次方程计算器
题目1101:计算表达式
SJTU的题目明显更好,然而纱布般的我做这种题无法1A,又听说CCNU机试只能提交一次,所以要GG了。。。。
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2720
解决:612
-
题目描述:
-
设计一个二次方程计算器
-
输入:
-
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
-
输出:
-
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。
-
样例输入:
-
x^2+x=3x+4
-
样例输出:
-
-1.24 3.24
思路:很直白的模拟,但是细节和边界要处理好,大致的模拟思路就是分等号左右边,记录下二次项,一次项和常数项的系数,这里要特别注意符号,把sgn变化的位置写挫了然后一直在跪,然而自己给的各种样例都能过也真是感动中国了。。记录好之后相减,然后得到正常的一元二次方程,然后用判别式求解就可以了。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string s;
int main()
{
while(cin>>s)
{
int pos;
for(int i=0;s[i]!='\0';i++)
{
if(s[i]=='=')
{
pos=i;
break;
}
}//找等号
int al,bl,cl;
al=bl=cl=0;
int ar,br,cr;
ar=br=cr=0;
int tmp=0;
int sgn=1;
for(int i=0;i<pos;)//处理左半部分
{
if(s[i]>='0'&&s[i]<='9')
{
tmp=tmp*10+s[i]-'0';
i++;
}//扫系数
else if(s[i]!='x')//要么是常数项要么是符号
{
if(s[i]=='+')
{
cl+=tmp*sgn;
sgn=1;
}
else if(s[i]=='-')
{
cl+=tmp*sgn;
sgn=-1;
}
i++;
tmp=0;//及时清零
}
else if(s[i]=='x'&&s[i+1]=='^')//二次项
{
if(i==0||s[i-1]=='+'||s[i-1]=='-')//特别注意一下在起始位置系数为1或-1
tmp=1;
al+=tmp*sgn;
tmp=0;
i=i+3;//连跳3个
}
else if(s[i]=='x'&&s[i+1]!='^')
{
if(i==0||s[i-1]=='+'||s[i-1]=='-')
tmp=1;
bl+=tmp*sgn;
tmp=0;
i++;
}
//cout<<2333<<endl;
}
cl+=tmp*sgn;
tmp=0;
sgn=1;
for(int i=pos+1;s[i]!='\0';)
{
if(s[i]>='0'&&s[i]<='9')
{
tmp=tmp*10+s[i]-'0';
i++;
}
else if(s[i]!='x')
{
if(s[i]=='+')
{
cr+=tmp*sgn;
sgn=1;
}
else if(s[i]=='-')
{
cr+=tmp*sgn;
sgn=-1;
}
i++;
tmp=0;
}
else if(s[i]=='x'&&s[i+1]=='^')
{
if(i==pos+1||s[i-1]=='+'||s[i-1]=='-')
tmp=1;
ar+=tmp*sgn;
tmp=0;
i=i+3;
}
else if(s[i]=='x'&&s[i+1]!='^')
{
if(i==pos+1||s[i-1]=='+'||s[i-1]=='-')
tmp=1;
br+=tmp*sgn;
tmp=0;
i++;
}
//cout<<2333<<endl;
}
cr+=tmp*sgn;
double a,b,c;
a=(al-ar)*1.0;
b=(bl-br)*1.0;
c=(cl-cr)*1.0;
if(b*b-4*a*c>=0)//基本判断有无解
{
double x1=(-b-sqrt(b*b-4.0*a*c))/(2.0*a);
double x2=(-b+sqrt(b*b-4.0*a*c))/(2.0*a);
double mina=min(x1,x2);
double maxn=max(x1,x2);
printf("%.2lf %.2lf\n",mina,maxn);
}
else
{
cout<<"No Solution"<<endl;
}
}
return 0;
}
题目1101:计算表达式
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:4276
解决:1311
-
题目描述:
-
对于一个不存在括号的表达式进行计算
-
输入:
-
存在多种数据,每组数据一行,表达式不存在空格
-
输出:
-
输出结果
-
样例输入:
-
6/2+3+3*4
-
样例输出:
-
18
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
stack<int> sn;
stack<char>sc;
int n;
int i;
char s[1005];
int getnum()
{
int tmp=0;
while(s[i]>='0'&&s[i]<='9')
{
tmp=tmp*10+s[i]-'0';
i++;
}
return tmp;
}
char getch()
{
return s[i++];
}
void calc()
{
int a,b,t;
char c;
if(sc.empty())
return ;
a=sn.top();
sn.pop();
b=sn.top();
sn.pop();
c=sc.top();
sc.pop();
// cout<<a<<"~~"<<b<<"~~"<<c<<endl;
switch(c)
{
case '+':
t=b+a;
break;
case '-':
t=b-a;
break;
case '*':
t=b*a;
break;
case '/':
t=b/a;
break;
}
sn.push(t);
}
int main()
{
while(cin>>s)
{
i=0;
char op;
n=getnum();
//cout<<n<<endl;
sn.push(int(n));
while(s[i]!='\0')
{
op=getch();
n=getnum();
// cout<<op<<"~~"<<n<<endl;
if(op=='+'||op=='-')
{
calc();
// cout<<sn.top()<<"~~"<<endl;
sc.push(op);
sn.push(int(n));
}
else
{
sc.push(op);
sn.push(int(n));
calc();
// cout<<sn.top()<<"~~"<<endl;
}
}
while(!sc.empty())
{
calc();
// cout<<sn.top()<<"~~"<<endl;
}
cout<<sn.top()<<endl;
sn.pop();
}
return 0;
}
SJTU的题目明显更好,然而纱布般的我做这种题无法1A,又听说CCNU机试只能提交一次,所以要GG了。。。。