• 九度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;
    }
    

      

  • 相关阅读:
    Oracle11g 干净卸载
    linux中的帮助命令
    Linux Samba文件共享服务,安装与案例配置
    linux文件系统相关命令(df/du/fsck/dumpe2fs)
    虚拟机VMware下CentOS6.6安装教程图文详解
    vnc连接远端linux服务器
    mysql57重新安装后无法再次启动mysql57服务“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动。”--解决方法
    (二)分布式数据库tidb-事务
    Centos 6下使用cmake编译安装MariaDB
    MySQL数据库基本知识
  • 原文地址:https://www.cnblogs.com/yspworld/p/4886298.html
Copyright © 2020-2023  润新知