1387 - 二次方程计算器
时间限制 : 1 秒
内存限制 : 32 MB
设计一个二次方程计算器
题目输入
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
题目输出
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。
输入/输出样例
输入格式
x^2+x=3x+4 x^2=-1
输出格式
-1.24 3.24 No Solution
C语言解答
#include<stdio.h> #include<string.h> #include<ctype.h> #include<assert.h> #include<math.h> char str[128]; int c[4]; int main() { int sign=1,i,r,p,sign1=1,f; while(scanf("%s",str)!=EOF) { memset(c,0,sizeof(c)); for(f=i=r=p=0;str[i];i++) { if (str[i]=='=') { if (p && r==0) r=1; c[p]+=sign*sign1*r; sign1=-1; r=p=f=0,sign=1; } else if (str[i]=='^') { p=str[i+1]-'0'; i++; } else if (str[i]=='+') { c[p]+=sign*sign1*r; sign=1,r=p=f=0; } else if (str[i]=='-') { c[p]+=sign*sign1*r; sign=1,r=p=f=0; } else if (str[i]=='x' || str[i]=='X') { if (!f) r=1; p=1;//p表示次数。有x至少次数为1,之后若再扫描到^则p变为2.若为常数项,p为初始值0,不变。 } else if (isdigit(str[i])) { r=r*10+str[i]-'0';//r表示x之前的系数。 f=1;//f用来表示x之前是否存在系数(flag)。返回上两行,if (!f),说明f为初始值0,故强制赋系数1. } } if (f) c[p]+=sign*sign1*r; assert(c[2]!=0); if (c[1]*c[1]>=4*c[0]*c[2]) { double d=sqrt(1.0*(c[1]*c[1]-4*c[0]*c[2])); printf("%.2lf %.2lf\n",(-c[1]-d)/2/c[2]+1e-6,(-c[1]+d)/2/c[2]+1e-6); } else puts("No Solution"); } return 0; }
C++解答
#include<stdio.h> #include<string.h> #include<ctype.h> #include<assert.h> #include<math.h> char str[128]; int c[4]; int main() { int sign=1,i,r,p,sign1=1,f; while(scanf("%s",str)!=EOF) { memset(c,0,sizeof(c)); for(f=i=r=p=0;str[i];i++) { if (str[i]=='=') { if (p && r==0) r=1; c[p]+=sign*sign1*r; sign1=-1; r=p=f=0,sign=1; } else if (str[i]=='^') { p=str[i+1]-'0'; i++; } else if (str[i]=='+') { c[p]+=sign*sign1*r; sign=1,r=p=f=0; } else if (str[i]=='-') { c[p]+=sign*sign1*r; sign=1,r=p=f=0; } else if (str[i]=='x' || str[i]=='X') { if (!f) r=1; p=1; } else if (isdigit(str[i])) { r=r*10+str[i]-'0'; f=1; } } if (f) c[p]+=sign*sign1*r; assert(c[2]!=0); if (c[1]*c[1]>=4*c[0]*c[2]) { double d=sqrt(c[1]*c[1]-4*c[0]*c[2]); printf("%.2lf %.2lf\n",(-c[1]-d)/2/c[2]+1e-6,(-c[1]+d)/2/c[2]+1e-6); } else puts("No Solution"); } return 0; }