zoukankan      html  css  js  c++  java
  • 九度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
    ", 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
    ", 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
    ", c-C);
    
        a=a-A;
        b=b-B;
        c=c-C;
        double dd=b*b-4*a*c;
        if(dd<0){
            printf("No Solution
    ");
        }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
    ", ans);
        }
    
        }
        return 0;
    }
    

      

  • 相关阅读:
    apue学习笔记(第十二章 线程控制)
    apue学习笔记(第十一章 线程)
    apue学习笔记(第十章 信号)
    apue学习笔记(第九章 进程关系)
    apue学习笔记(第八章 进程控制)
    apue学习笔记(第七章 进程环境)
    apue学习笔记(第六章 系统数据文件和信息)
    apue学习笔记(第五章 标准I/O)
    apue学习笔记(第四章 文件和目录)
    apue学习笔记(第三章 文件I/O)
  • 原文地址:https://www.cnblogs.com/yspworld/p/4886298.html
Copyright © 2011-2022 走看看