题目没说清测试用例是否会退化为一次方程,把无穷解的情况归类为无解了;(你也不告诉我最大字符串的长度,人家北大就告诉);
思路:
1)利用符号('-''+''=''\0')分段读取,把字符串解析为数值;
2)左右双指针取段,r从1开始即可解决负数开头的情况;
3)利用flag控制正负,减少代码量,没别的代码少,写的快就是最贵的,时间什么的无所谓,能过就行;
高阶玩法:
可以用c++<regex>正则表达式;用的好挺玩赖的;
#include <stdio.h>
#include <string.h>
#include <math.h>
float delta(float a, float b, float c) {return b*b-4*a*c;}
void getans(float a, float b, float c){
float d = delta(a, b, c);
if(a==0 && b!=0) printf("%.2f %.2f\n", -c/b, -c/b);
else if(a==0 && b==0) printf("No Solution\n");
else if(d>=0){
printf("%.2f %.2f\n", (-b-sqrt(d))/(2*a), (-b+sqrt(d))/(2*a));
}else printf("No Solution\n");
}
int getn(char *str, int len){
int res=0, i=0, flag=1;
if(str[0]=='-'){
++i;
flag=-1;
}
if(i==len) res=1;
else{
while(i<len){
res *= 10;
res += str[i]-'0';
++i;
}
}
return res*flag;
}
void getnums(char *str, float *a, float *b, float *c){
int l=0, r=1, flag=1;
while(r<=strlen(str)){
while(r<strlen(str)&&!(str[r]=='+' || str[r]=='-' || str[r]=='='))++r;
if(r-l>2&&str[r-3]=='x'){*a+=flag*getn(str+l, r-l-3);}
else if(str[r-1]=='x'){*b+=flag*getn(str+l, r-l-1);}
else {*c+=flag*getn(str+l, r-l);}
l=r+1;
if(str[r]=='=') {flag=-1; ++r;}
++r;
}
}
int main()
{
char str[100];
while(scanf("%s", str)!=EOF){
float a=0, b=0, c=0;
getnums(str, &a, &b, &c);
getans(a, b, c);
}
return 0;
}

京公网安备 11010502036488号