Vijos P1344计算器的改良(java未AC,如果有神牛来帮我修改,感激不尽啊!)

P1344计算器的改良Wrong Answer
标签:NOIP普及组2000[显示标签]
描述
问题描述:
NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
问题求解:
编写程序,解输入的一元一次方程,将解方程的结果(精确至小数点后三位)输出至屏幕。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
 
 

样例1

样例输入1[复制]

6a-5+1=2-2a

样例输出1[复制]

a=0.750

限制

1 second

来源

NOIP 2000年 第六届 普及组 第1题






 //整体思路,把整个方程式化简成左边是未知数,而右边是常数的形式

import java.io.*;
import java.util.*;
import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        double count = 0, constant = 0; // constant记录未知数的个数,count记录总的数值
        String equation, equation1; // 方程式的字符串
        int Equivalent = 0; // 记录等号位置
        int LastFlag = 0; // 记录最后一个未知数的个数
        char UnknowNumber = 'a'; // 记录改未知数是那个未知数
        equation1 = input.nextLine();
        equation = '+' + equation1;
        equation = equation.replaceAll("=", "=+");
        // System.out.println(equation);

        /*
         * System.out.println(equation.length());
         */

        char[] chars = equation.toCharArray();
        Equivalent = equation.indexOf('=');

        /*
         * 记录等号左边的运算 (因为换边的话会改变符号)
         */
        for (int i = 0; i < Equivalent; i++) {

            if ((chars[i] >= 'a' && chars[i] <= 'z')
                    || (chars[i] >= 'A' && chars[i] <= 'Z')) {
                UnknowNumber = chars[i]; // 记住该未知数
                int FlagForFirst = 0; // FlagForFirst记录当前未知数的位置
                String x; // x记录当前未知数的个数
                boolean XSign = true; // 新的未知数标志记录符号

                for (int j = i; j > 0; j--) {
                    if (chars[j] == '+') {
                        FlagForFirst = j;
                        XSign = true;
                        break;
                    }
                    if (chars[j] == '-') {
                        FlagForFirst = j;
                        XSign = false;
                        break;
                    }
                }
                x = equation.substring(FlagForFirst + 1, i);
                int y = Integer.parseInt(x); // y记录当前未知数的个数
                if (XSign) {
                    constant += y;
                } else {
                    constant -= y;
                }

                // System.out.println(constant);

            }
        }

        /*
         * 从这里开始计算剩余项
         */
        boolean Finish = true; // 设置一个标志为记录中间是否有未知数,false表示有字母,true表示没有字母
        String CountForNumber; // 记录数字运算,count记录总的数值
        boolean YSign = true; // 记录数字的符号
        for (int i = 0; i < Equivalent; i++) {
            int j;
            if (chars[i] == '+' || chars[i] == '-') {
                if (chars[i] == '+') {
                    YSign = true;
                }
                if (chars[i] == '-') {
                    YSign = false;
                }
                j = i + 1;
                while (chars[j] != '+' && chars[j] != '-' && chars[j] != '=') {
                    j++;
                }

                // System.out.println(i+" "+j); // 测试在两个运算符号之间
                Finish = true;
                for (int k = j; k > i; k--) {
                    if ((chars[k] >= 'a' && chars[k] <= 'z')
                            || (chars[k] >= 'A' && chars[k] <= 'Z')) {
                        Finish = false;
                        break;
                    }
                    if (k == i + 1 && Finish) {
                        CountForNumber = equation.substring(i + 1, j);

                        // System.out.println(CountForNumber);

                        int temp = Integer.parseInt(CountForNumber);
                        if (YSign) {
                            count -= temp;
                        } else {
                            count += temp;
                        }
                        // System.out.println(count);
                    }
                }

            }

        }

        /*
         * 
         * 开始计算右边的值 写到这里其实已经完成了70%了,因为算法是一样的,只不过左边和右边需要变号
         * 修改一下原来的代码,左边的算式计算完毕,接下来就是计算右边的 算式了。
         */

        for (int i = Equivalent; i < equation.length(); i++) {

            if ((chars[i] >= 'a' && chars[i] <= 'z')
                    || (chars[i] >= 'A' && chars[i] <= 'Z')) {
                int FlagForFirst = 0; // FlagForFirst记录当前未知数的位置
                String x; // x记录当前未知数的个数
                boolean XSign = true; // 新的未知数标志记录符号

                for (int j = i; j > 0; j--) {
                    if (chars[j] == '+') {
                        FlagForFirst = j;
                        XSign = true;
                        break;
                    }
                    if (chars[j] == '-') {
                        FlagForFirst = j;
                        XSign = false;
                        break;
                    }
                }
                x = equation.substring(FlagForFirst + 1, i);
                int y = Integer.parseInt(x); // y记录当前未知数的个数
                if (XSign) {
                    constant -= y;
                } else {
                    constant += y;
                }

                // System.out.println(constant);
            }
        }

        boolean Finish2 = true; // 设置一个标志为记录中间是否有未知数,false表示有字母,true表示没有字母
        String CountForNumber2; // 记录数字运算,count记录总的数值
        boolean YSign2 = true; // 记录数字的符号
        for (int i = Equivalent; i < equation.length() - 2; i++) {
            int j;
            if (chars[i] == '+' || chars[i] == '-') {
                if (chars[i] == '+') {
                    YSign2 = true;
                }
                if (chars[i] == '-') {
                    YSign2 = false;
                }
                j = i + 1;
                while (chars[j] != '+' && chars[j] != '-'
                        && j < equation.length() - 1) {
                    j++;
                }

                // System.out.println(i+" "+j); // 测试在两个运算符号之间
                Finish2 = true;
                for (int k = j; k > i; k--) {
                    if ((chars[k] >= 'a' && chars[k] <= 'z')
                            || (chars[k] >= 'A' && chars[k] <= 'Z')) {
                        Finish2 = false;
                        break;
                    }
                    if (k == i + 1 && Finish2) {
                        CountForNumber2 = equation.substring(i + 1, j);

                        // System.out.println(CountForNumber);

                        int temp = Integer.parseInt(CountForNumber2);
                        if (YSign2) {
                            count += temp;
                        } else {
                            count -= temp;
                        }
                    }
                }

            }

        }

        /*
         * System.out.println(constant); System.out.println(count);
         */
        DecimalFormat df = new DecimalFormat("0.000");
        double answer = count / constant;
        System.out.print(UnknowNumber + "=");
        System.out.println(df.format(answer));
    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值