2021.06.02会解方程的计算器

2021.06.02会解方程的计算器

(题目来源:)

题目描述

为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:

4+3x=8

6a-5+1=2-2a

-5+12y=0

ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。

你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。

输入格式

一个一元一次方程。

输出格式

解方程的结果(精确至小数点后三位)。

样例输入

6a-5+1=2-2a

样例输出

a=0.750

思路

模拟题,talk is cheap, show u the code.

代码

    class Solution{ 
        void test() {
            Scanner cin = new Scanner(System.in);
            String fun = cin.nextLine();
            String[] strs = fun.split("=");
            String left = strs[0];
            String right = strs[1];
            if(left.charAt(0) != '+' && left.charAt(0) != '-') left = '+'+left;
            if(right.charAt(0) != '+' && right.charAt(0) != '-') right = '+'+right;
            int lasInd = -1;
            List<num> leftNums = new ArrayList<num>(); //左边所有项
            lasInd = 0;
            for(int i = 0; i < left.length(); i++) {
                if((left.charAt(i) == '+' || left.charAt(i) == '-') && i != 0) {
                    leftNums.add(new num(left.substring(lasInd,i)));
                    lasInd = i;
                }
            }
            leftNums.add(new num(left.substring(lasInd)));
            List<num> rightNums = new ArrayList<num>(); //右边所有项
            lasInd = 0;
            for(int i = 0; i < right.length(); i++) {
                if((right.charAt(i) == '+' || right.charAt(i) == '-') && i != 0) {
                    rightNums.add(new num(right.substring(lasInd,i)));
                    lasInd = i;
                }
            }
            rightNums.add(new num(right.substring(lasInd)));
            int t = 0; //合并后的系数
            int c = 0;
            for(num x: leftNums) { 
                if(x.above0) {
                    if(x.isX) t += x.times;
                    else c += x.n;
                } else {
                    if(x.isX) t -= x.times;
                    else c -= x.n;
                }
            }
            for(num x: rightNums) {
                if(x.above0) {
                    if(x.isX) t -= x.times;
                    else c -= x.n;
                } else {
                    if(x.isX) t += x.times;
                    else c += x.n;
                }
            }
            double C = c*(-1);
            double T = t;
            char ch = 'x';
            for(int i = 0; i < fun.length(); i++) if(fun.charAt(i)>='a'&&fun.charAt(i)<='z') {
                ch = fun.charAt(i);
                break;
            }
            if(c==0) System.out.println("0.000"); //由于浮点数表示时会显示"-0.000"
            else System.out.printf(ch+"=%.3f",C/T);
        }
    }
    class num{
        int n;
        boolean isX = false;
        boolean above0;
        int times;
        char ch;
        num(String arg){
            //判断正负
            if(arg.charAt(0) == '+')above0 = true;
            else above0 = false;
            //判断是否有未知数
            int ind = -1;
            for(int i = 0; i < arg.length(); i++) {
                if(arg.charAt(i)>='a' && arg.charAt(i)<='z') {
                    ind = i;
                    ch = arg.charAt(i);
                    isX = true;
                    break;
                }
            }
            if(isX) { //如果有未知数,找到系数
                StringBuilder sb = new StringBuilder();
                for(int i = 1; i < ind; i++) {
                    sb.append(arg.charAt(i));
                }
                if(sb.length()==0) times = 1;
                else times = Integer.parseInt(sb.toString());
            } else { //如果没有未知数,找到数值大小
                n = Integer.parseInt(arg.substring(1));
            }
        }
        @Override
        public String toString() {
            if(isX) {
                return "有未知数:"+(above0?"+":"-")+times+"x";
            } else {
                return (above0?"+":"-")+n;
            }
        }
    }
第一点,我是在matlabR2021b中构建代码,第二点我会提供初始条件,第三点我会给你提供我看的文献中使用的物性公式的原理。初始条件如下:设备特性: 填料内直径为 0.156m, 填料轴向长度为 0.025m, 填料外直径为 0.396m, 也就是说:ri=0.078m,r0=0.198m (文献中r是在半径上的), 填料体积为 0.0026m³, 比表面积为 2132m²/m³, 空隙率无单位且数值为 0.76, 填料类型为 EXPAMET。 进料参数: MEA(质量分数):56wt.% 转子转速:600 转 / 分钟、 进料溶液温度: 39.6℃(312.75K)等 二、流量参数 气体进料: 总体积流量:64m³/h(0.017778m³/s、1.06667m³/min、1066.67L/min) 总质量流量:77.4kg/s(278640kg/h) 总摩尔流量: 2.87kmol/h(0.0007944kmol/s) 液体进料: 总体积流量:2.4m³/h(0.0006667 m³/s、0.04m³/min、40L/min) 总质量流量:0.66kg/s(2376kg/h) 总摩尔流量:未在文献中找到 三、负载与组分参数 进料(贫液)的 CO₂负载:0.0772 进料摩尔分数(MEA):0.2814 进料摩尔分数(H₂O):0.697 进料摩尔分数(CO₂):0.0216 进料气体组分(假设理想气体): 气相MEA摩尔/体积分数:0 水蒸气摩尔/体积分数:0.1679 CO₂摩尔/体积分数:0.0471 氮气摩尔/体积分数:0.785 ASPEN进料物性: 液相: 液相温度 C 40 液相摩尔密度 kmol/ m3) 33.26775347 液相质量密度 (kg/m3) 1043.739064 液相粘度,混合物 cP 5.19132046 液相运动粘度 m2/s 4.97E-06 液相表面张力,混合物 N/m 0.055474614 液相中的质量浓度 kg/ m3 1.04E-06 液相平均分子量 31.3738968 亨利常数 液相CO2的亨利常数 kPa 94331.979145751 液相CO2的摩尔浓度 kmol/ m3 2.36E-08 液相CO2的亨利常数 kPa·m³/kmol 4.00E+12 液相组分在混合物中的扩散系数 MEA的扩散系数 m2/s 1.74E-09 H2O的扩散系数 m2/s 3.12E-10 CO2的扩散系数 m2/s 6.50E-10 活度系数 液相CO2的活度系数 0.985225969 液相MEA的活度系数 0.538221053 液相H2O的活度系数 0.980702358 液相"纯组分饱和蒸气压 MEA kPa 0.166272705 H2O kPa 7.409543169 CO2 kPa 8966.723474 气相 气相温度 C 40 气相摩尔密度 kmol/ m3) 0.043360961 气相质量密度 (kg/ m3) 1.174570812 气相粘度,混合物 cP 0.018081782 气相运动粘度 m2/s 1.65E-05 气相CO2在混合物中的扩散系数 m2/s 1.85E-05 气相扩散系数 MEA的扩散系数 m2/s 1.19E-05 H2O的扩散系数 m2/s 2.59E-05 CO2的扩散系数 m2/s 1.85E-05 其他 平均分子量 27.08821008 体积流量: m3/s 0.017888889 摩尔流量 kmol/s 0.000775679 质量流量 kg/s 0.021011767 进料摩尔浓度 液相 MEA kmol/ m3 8.099416627 H2O kmol/ m3 23.69196445 CO2 kmol/ m3 2.36E-08 N2 kmol/ m3 0 气相 MEA kmol/ m3 0 H2O kmol/ m3 0.002867285 CO2 kmol/ m3 0.002042365 N2 kmol/ m3 0.034041045
12-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值