1387 - 二次方程计算器

设计一个二次方程计算器

题目输入

每个案例是关于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;
}

时间限制 1 秒
内存限制 32 MB
讨论 统计
上一题 下一题