二元一次方程组简单解法(输入样式有介绍)

提示输入方程时输入如:5x+3y=2 要求全部字符串无空格

  1 package cn.aikang.Calculation;
  2
  3 import java.math.BigDecimal;
  4 import java.util.Scanner;
  5 //BigDecimal
  6 /**
  7  * @Description: TODO(这里用一句话描述这个类的作用)
  8  * @Author aikang
  9  * @Date 2019/10/12 8:38
 10  */
 11 public class EquationCalculation {
 12
 13     // 主方法
 14     public static void main(String[] args) {
 15         //1. 调用用户输入方法接收得到的数组
 16         String[] UserScannerArr = UserScanner();
 17         //["5x+3y=2","3x+2y=1"]
 18
 19         //2. 调用分割功能
 20         double[][] doubles1 = ExtractUserArr(UserScannerArr);
 21
 22         //3.调用计算功能返回第一个式子xy的值
 23         double[] doubles2 = CalculationXY(doubles1);
 24
 25         //4.调用最后结果判断功能
 26         boolean result = Result(doubles1, doubles2);
 27         //做判断看式子是否成立
 28         if(result){
 29             System.out.println("结果为:");
 30             System.out.println("x:"+doubles2[0]+"y"+doubles2[1]);
 31         }else{
 32             System.out.println("此方法无解");
 33         }
 34
 35     }
 36
 37     //1. 实现用户输入功能
 38     public static String[] UserScanner(){
 39         // 1.1 创建一个String类型的二维数组用来返回用户输入
 40         String[] ScannerArr = new String[2];
 41         Scanner scanner = new Scanner(System.in);
 42         // 1.2 循环ScannerArr的长度让用户输入
 43         for (int i = 0; i < ScannerArr.length; i++) {
 44             //提示用户输入
 45             System.out.println("请输入第"+(i+1)+"个方程");
 46             //让用户输入方程组
 47             ScannerArr[i] = scanner.nextLine();
 48         }
 49         return ScannerArr;
 50     }
 51
 52     //2.实现用户传入数组做分割提取系数和等值返回
 53     public static double[][] ExtractUserArr(String[] userArr){
 54         //1.创建一个二维数组用来存储提取出来的系数第一个数组存储第一个方程的系数:x的系数y的系数等值
 55         double[][] userXYxxcc = new double[2][3];
 56
 57         //2. for循环userArr数组处理两个方程
 58         for (int i = 0; i < userArr.length; i++) {
 59             //3.使用x分割传入对应位置
 60             String[] xes1 = userArr[i].split("x");
 61             //3.1 判断提取出来的是否是空,如果是则赋值1
 62             if (xes1[0] == null || "".equals(xes1[0])){
 63                 userXYxxcc[i][0] = 1;
 64             }else if(xes1[0] == "-"){
 65                 userXYxxcc[i][0] = -1;
 66             }else {
 67                 userXYxxcc[i][0] = Double.parseDouble(xes1[0]);
 68             }
 69
 70             //4. 使用y继续分割xes[1]得到xes2
 71             String[] xes2 = xes1[1].split("y");
 72             if (xes2[0] == null || "".equals(xes2[0])){
 73                 userXYxxcc[i][1] = 1;
 74             }else if(xes2[0] == "-"){
 75                 userXYxxcc[i][1] = -1;
 76             }else {
 77                 userXYxxcc[i][1] = Double.parseDouble(xes2[0]);
 78             }
 79
 80             //使用xes2[]=分割得到等值
 81             String[] xes3 = xes2[1].split("=");
 82             userXYxxcc[i][2] = Double.parseDouble(xes3[1]);
 83         }
 84         return userXYxxcc;
 85     }
 86
 87     //3. 实现传入数组计算出x,y的值
 88     public static double[] CalculationXY(double[][] CcArr){
 89         //1.定义数组存储xy
 90         double[] xy = new double[2];
 91         //1.1创建//BigDecimal用来运算
 92         BigDecimal x1 = new BigDecimal(CcArr[0][0]);
 93         BigDecimal y1 = new BigDecimal(CcArr[0][1]);
 94         BigDecimal e1 = new BigDecimal(CcArr[0][2]);
 95         BigDecimal x2 = new BigDecimal(CcArr[1][0]);
 96         BigDecimal y2 = new BigDecimal(CcArr[1][1]);
 97         BigDecimal e2 = new BigDecimal(CcArr[1][2]);
 98         //2.定义变量计算公约
 99         BigDecimal x1_1 = x1.multiply(y2);
100         BigDecimal y1_1 = y1.multiply(y2);
101         BigDecimal e1_1 = e1.multiply(y2);
102
103         BigDecimal x2_1 = x2.multiply(y1);
104         BigDecimal y2_1 = y2.multiply(y1);
105         BigDecimal e2_1 = e2.multiply(y1);
106
107         //3. 计算得出y2-y1 = 0所以(x2-x1)*x = CcArr[0][2]得到x = CcArr[0][2]/(x2-x1)
108         //3.1定义变量x
109         BigDecimal x = (e2_1.subtract(e1_1)).divide((x2_1.subtract(x1_1)));
110
111         //4.代入x计算出第一个式子的y
112         BigDecimal yy = e1.subtract(x1.multiply(x));
113         BigDecimal y = yy.divide(y1);
114         double userx = x.doubleValue();
115         double usery = y.doubleValue();
116
117         //赋值
118         xy[0] = userx;
119         xy[1] = usery;
120         //5.返回xy
121         return xy;
122     }
123
124     //4.实现两个式子代入xy值进行计算查看是否相等
125     //第一个参数为xy的系数和结果,第二个参数为第一个式子计算得出的xy
126     public static boolean Result(double[][] doubles1,double[] doubles2){
127         //定义一个boolean值统计状态
128         boolean rt;
129         //定义BigDecimal计算
130         BigDecimal x2 = new BigDecimal(doubles1[1][0]);
131         BigDecimal y2 = new BigDecimal(doubles1[1][1]);
132         BigDecimal e2 = new BigDecimal(doubles1[1][2]);
133         BigDecimal x = new BigDecimal(doubles2[0]);
134         BigDecimal y = new BigDecimal(doubles2[1]);
135
136         //判断第二个式子是否成立
137         BigDecimal x1 = x2.multiply(x);
138         BigDecimal y1 = y2.multiply(y);
139         if(x1.add(y1).equals(e2)){
140             rt = true;
141         }else{
142             rt = false;
143         }
144         return rt;
145     }
146 }

原文地址:https://www.cnblogs.com/aikang525/p/11660668.html

时间: 2024-10-19 21:10:45

二元一次方程组简单解法(输入样式有介绍)的相关文章

二元一次方程组求解

首先要找到二元一次方程组的通解,例如: ax+by=m cx+dy=n 不难算出 x=(md-bn)/(ad-bc) y=(mc-an)/(bc-ad) 程序代码: #include<stdio.h> #include<math.h> int main(){ int a,b,c,d,m,n; double x=0,y=0; scanf("%d,%d,%d,%d,%d,%d",&a,&b,&c,&d,&m,&n);

解不等式组、二元一次方程组、三元一次方程组

不等式性质: 一.加减同一个数,方向不变. 二.乘以(除以)同一个正数,方向不变. 三.乘以(除以)同一个负数,方向改变. 例:/3x - 15 > 0  ① \7x - 2 < 8x  ② 解①式可得 x > 5 解②可可得 -2 < x 该不等式的解集为 x > 5 解二元一次方程组: 1.消元解二元一次方程组有代入消元和加减消元法. 2.代入消元法:把二元一次方程组的一个未知数用另一个未知数表示出来,再带入另一个方程,实现消元. 3.加减消元法:两个方程中同一个未知数系

js实现求二元一次方程的根

已知ax的平方+bx+c=0;求根:<br />系数A:<input type="number" id="a" /><br />系数B:<input type="number" id="b" /><br />系数C:<input type="number" id="c" /><br /><input

作业二:生成四则运算和二元一次方程

生成四则运算所用方法类似生成二叉树的方法递归添加.直接上代码! public class 四则运算 { public static String str = "";//保存题目的字符串 public static int num = 5;//每题中数的个数 public static int num_i = 0;//题目中已有数的个数 public static int numberRange = 100;//运算中数的最大取值 public static double sum = 0

求解三元一次方程组(C++)

/** * author:johnny zen * date:2017-09-20 11:19 * function:Calculate Ternary system of equations * notice:时间仓促,仅仅实现功能,方便使用,代码质量不可参考!!! */ #include<iostream> using namespace std; template<class T> void input(T matrix[4][5]){ cout<<"p

1101: 零起点学算法08——简单的输入和计算(a+b)

1101: 零起点学算法08--简单的输入和计算(a+b) Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 3669  Accepted: 1997[Submit][Status][Web Board] Description 前面7道题做下来,对输出和计算有点感觉了吧? 不过很可惜的是前面的做法,好像太死了,写了一个计算3+4的程序,计算5+6又得改程序,计算机真的只能这么实现,那么我们比计算机

1102: 零起点学算法09——继续练习简单的输入和计算(a-b)

1102: 零起点学算法09--继续练习简单的输入和计算(a-b) Time Limit: 1 Sec  Memory Limit: 520 MB   64bit IO Format: %lldSubmitted: 2810  Accepted: 2161[Submit][Status][Web Board] Description 简单吧,不用多说了 Input 输入2个整数a,b,用空格隔开 Output 输出a-b的值 Sample Input 10 5 Sample Output 5 S

次短路径与次小生成树问题的简单解法——转自:BYVoid

次短路径与次小生成树问题的简单解法 [次短路径] 次短路径可以看作是k短路径问题的一种特殊情况,求k短路径有Yen算法等较为复杂的方法,对于次短路径,可以有更为简易的方法.下面介绍一种求两个顶点之间次短路径的解法. 我们要对一个有向赋权图(无向图每条边可以看作两条相反的有向边)的顶点S到T之间求次短路径,首先应求出S的单源最短路径.遍历有向图,标记出可以在最短路径上的边,加入集合K.然后枚举删除集合K中每条边,求从S到T的最短路径,记录每次求出的路径长度值,其最小值就是次短路径的长度. 在这里我

一个简单的TabItem样式。

分享一个以前项目中用到的简单的TabItem样式. 效果图如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <SolidColorBrush x:Key="TabItemDisabledBackground" Color="#F4F4F4"/> <SolidColorBr