九度oj-题目1103:二次方程计算器
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2799
解决:633
- 题目描述:
-
设计一个二次方程计算器
- 输入:
-
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
- 输出:
-
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。
- 样例输入:
-
x^2+x=3x+4
- 样例输出:
-
-1.24 3.24
- 来源:
- 2011年上海交通大学计算机研究生机试真题
- 因为是多组输入,导致WA一发!
- 分析:统计x^2的系数,统计x的系数,统计常数和。转换成ax^2+bx+c=0的形式,公式法求解。
-
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <iostream> #include <string> #include <algorithm> using namespace std; int main() { char s[200]; int i, j, len; while(scanf("%s", s)!=EOF) { len=strlen(s); int a=0, b=0, c=0; int A=0, B=0, C=0; int pos; for(i=0; i<len; i++){ if(s[i]=='='){ pos=i; break; } }//先找到到= for(i=0; i+2<pos; i++){ if(s[i]=='x' && s[i+1]=='^' && s[i+2]=='2'){ if(i-1==-1){ a=a+1; } else if(i-1>-1){ int jin=1; int cur=0; j=i-1; while(isdigit(s[j]) && j>=0){ cur=cur+(s[j]-48)*jin; jin=jin*10; j--; } if(cur==0) cur=1; if(j>=0 && s[j]=='-') cur=-cur; a+=cur; } } } for(i=pos+1; i+2<len; i++){ if(s[i]=='x' && s[i+1]=='^' && s[i+2]=='2'){ if(i-1==pos){ A=A+1; } else if(i-1>pos){ int jin=1; int cur=0; j=i-1; while(isdigit(s[j]) && j>pos){ cur=cur+(s[j]-48)*jin; jin=jin*10; j--; } if(cur==0) cur=1; if(j>pos && s[j]=='-') cur=-cur; A+=cur; } } } //printf("%d\n", a-A); for(i=0; i<pos; i++){ if(s[i]=='x' && s[i+1]!='^'){//这一定是x的一次方 int jin=1; int cur=0; j=i-1; while(isdigit(s[j]) && j>=0){ cur=cur+jin*(s[j]-48); jin=jin*10; j--; } if(cur==0) cur=1; if(j>=0 && s[j]=='-') cur=-cur; b+=cur; } } for(i=pos+1; i<len; i++){ if(s[i]=='x'){ if(i+1<len ){ if(s[i+1]!='^'){ int jin=1; int cur=0; j=i-1; while(isdigit(s[j]) && j>pos){ cur=cur+jin*(s[j]-48); jin=jin*10; j--; } if(cur==0) cur=1; if(j>pos && s[j]=='-') cur=-cur; B+=cur; } }else{ int jin=1; int cur=0; j=i-1; while(isdigit(s[j]) && j>pos){ cur=cur+jin*(s[j]-48); jin=jin*10; j--; } if(cur==0) cur=1; if(j>pos && s[j]=='-') cur=-cur; B+=cur; } } } //printf("%d\n", b-B); for(i=0; i<=pos; i++){ if(s[i]=='+'||s[i]=='-'||s[i]=='='){ int jin=1; int cur=0; j=i-1; while(isdigit(s[j]) && j>=0){ cur=cur+jin*(s[j]-48); jin=jin*10; j--; } if(j>=0 && s[j]=='^') cur=0; if(j>=0 && s[j]=='-') cur=-cur; c+=cur; } } for(i=pos+1; i<len; i++){ if(s[i]=='+' || s[i]=='-'){ int jin=1; int cur=0; j=i-1; while(isdigit(s[j]) && j>pos){ cur=cur+jin*(s[j]-48); jin=jin*10; j--; } if(j>pos && s[j]=='^') cur=0; if(j>pos && s[j]=='-') cur=-cur; C+=cur; } } if(isdigit(s[len-1])){ int jin=1; int cur=0; j=i-1; while(isdigit(s[j]) && j>pos){ cur=cur+jin*(s[j]-48); jin=jin*10; j--; } if(j>pos && s[j]=='^') cur=0; if(j>pos && s[j]=='-') cur=-cur; C+=cur; } //printf("%d\n", c-C); a=a-A; b=b-B; c=c-C; double dd=b*b-4*a*c; if(dd<0){ printf("No Solution\n"); }else{ double ans; ans=(-b-sqrt(b*b-4*a*c))/(2.0*a); printf("%.2lf ", ans); ans=(-b+sqrt(b*b-4*a*c))/(2.0*a); printf("%.2lf\n", ans); } } return 0; }