java求方程的解_给定一个 n 元一次方程组,求方程组的解。(java8)
问题:
输入
测试数据只有一组。
第一行为整数 n (1≤n≤26),表示方程组有 n 元,接下去 n 行为方程。
第 2 到 n+1 行为方程组。并且方程的格式按以下的格式规定:
方程中的变量为大写的字母 A-Z,也就是说,最多有 26 个变量。
方程中只有字母,整数,+ 号,- 号,= 号,没有多余的空格。
每个方程中至少有一个变量,相同的变量不会重复出现。
每个方程中有且只有一个 = 号,并且变量只会出现在等号的左边,常数只会出现在右边。
输出
如果方程有解 (有唯一解),则输出 n 行方程的解,格式为(结果按 A-Z 的顺序输出):
A=1.00
B=-1.00
C=3.12
…
中间不包含多余的空格,精确到 0.01(需要四舍五入)。
如果方程没有解,或者有不止一个的解,输出 No solution。
样例
input
3
1A+2B+3D=4
+2A+4B+5D=3
B+3A+2D=1
output
A=-1.40
B=-4.80
D=5.00
package day1;
import java.text.DecimalFormat;
import java.util.*;
import java.util.regex.Pattern;
public class equation {
//移除数组中为空的元素
public static String[] removeArrayEmptyText(String[] strArray) {
List strList= Arrays.asList(strArray);
List strListNew=new ArrayList<>();
for (int i = 0; i
if (strList.get(i)!=null&&!strList.get(i).equals("")){
strListNew.add(strList.get(i)); }
}
String[] strNewArray = strListNew.toArray(new String[strListNew.size()]);
return strNewArray;
}
//四舍五入,不足保留数位时用0补全
public static String roundByScale(double v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
if(scale == 0){
return new DecimalFormat("0").format(v);
}
String formatStr = "0.";
for(int i=0;i
formatStr = formatStr + "0";
}
return new DecimalFormat(formatStr).format(v);
}
//方程式转换为矩阵
public static Double[][] strFormatMatrix(Double[][] matrix,String[] variables,String[] equations){
HashMap dict=new HashMap<>();
for (int i = 0; i
//dict init
for (int j = 0; j
dict.put(variables[j],Double.valueOf(0));
}
String[] var=removeArrayEmptyText(equations[i].split("\\W|[0-9]"));//变量
String[] numbers=removeArrayEmptyText(equations[i].split("[A-Z]|="));//数值
for (int j = 0; j
Double number ;
if(numbers[j].equals("+")){
number=Double.valueOf(1);
}else if(numbers[j].equals("-")){
number=Double.valueOf(-1);
}else {
number = Double.valueOf(numbers[j]);
}
dict.put(var[j],number);
}
for (int j = 0; j
matrix[i][j]=dict.get(variables[j]);
}
matrix[i][variables.length]=(Double.valueOf(numbers[numbers.length-1]));
}
return matrix;
}
//高斯消元法
public static void gauss(Double[][] matrix,int numOfVar,String[] variables){
ArrayList ed=new ArrayList<>();
for (int q = 0; q
for (int i = 0; i < numOfVar; i++) {
if (matrix[i][q] != 0&&ed.indexOf(i)==-1) {
ed.add(i);
for (int j = 0; j < numOfVar; j++) {
if (matrix[j][q] != 0&&j!=i) {
Double rate=matrix[j][q]/matrix[i][q];
for (int k = 0; k < numOfVar+1; k++) {
matrix[j][k]=matrix[j][k]-rate*matrix[i][k];
}
}
}
break;
}
}
}
//化为单位矩阵
for (int i = 0; i
for (int j = 0; j
if (matrix[i][j]!=1 && matrix[i][j]!=0){
matrix[i][numOfVar]=matrix[i][numOfVar]/matrix[i][j];
matrix[i][j]=Double.valueOf(1);
break;
}
}
}
//判断是否有解
int countOfY=0;
for (int i = 0; i
if(matrix[i][numOfVar]!=0){
countOfY++;
}
}
int countOfX=0;
for (int i = 0; i
for (int j = 0; j
if (matrix[i][j]!=0){
countOfX++;
break;
}
}
}
if(countOfX==countOfY&&countOfX==numOfVar){
for (int i = 0; i
for (int j = 0; j
if (matrix[j][i]!=0){
System.out.println(variables[i]+"="+roundByScale(matrix[j][numOfVar],2)) ;
break;
}
}
}
}else {
System.out.println("No solution");
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num=Integer.parseInt(sc.nextLine());
Double[][] matrix=new Double[num][num+1];
String[] var=new String[num];
String[] equs=new String[num];
for (int i = 0; i
var[i]="Null";
}
for (int i = 0; i < num; i++) {
String equ=sc.nextLine();
if(!Pattern.matches("\\W",String.valueOf(equ.charAt(0)))){
equ='+'+equ;
}
equs[i]=equ;
}
sc.close();
int count=0;
for (int i = 0; i
String[] current=removeArrayEmptyText(equs[i].split("\\W|[0-9]"));
for (int j = 0; j
if(Arrays.binarySearch(var,current[j])<0){
var[count]=current[j];
count++;
if(count==num){
break;
}
}
}
Arrays.sort(var);
}
strFormatMatrix(matrix,var,equs);
gauss(matrix,num,var);
}
}
java求方程的解_给定一个 n 元一次方程组,求方程组的解。(java8)相关推荐
- Python(分治算法)问题 F: 求逆序对_给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
问题 F: 求逆序对 题目描述 给定一个序列a1,a2,-,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目. 注意:n<=10^5,ai<=10^5 ...
- 给定一个未排序的数组,求如果数组排序之后,相邻数的最大差值。
给定一个未排序的数组,求如果数组排序之后,相邻数的最大差值.要求时间复杂度为O(n),且要求不能用非基于比较的排序. 首先,这个问题明显限制了不能使用直接排序的方式求解.因为基于比较的排序时间复杂度最 ...
- java 求最长重复子串_给定一个字符串,求出其最长的重复子串。
#include #include #include #include using namespace std; //给定一个字符串,求出其最长的重复子串 //方法一 string lsubstr_1 ...
- Java中找出s字符串的回文_给定一个字符串 s,找到 s 中最长的回文子串。
题目描述:给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 思路: 判断s[i..j]是否是回文字符串,依赖于s[i+1...j-1],这种一个问题的结果依赖于 ...
- java二叉树镜像_给定一个二叉树,检查它是否是镜像对称的。
原题 给定一个二叉树,检查它是否是镜像对称的. 原理 以根节点划分中心线,检查是否镜像对称. 一个指向从左节点出发,一个节点从右节点出发比较. 左节点的左孩子和右节点的右孩子比较 左节点的右孩子和右节 ...
- python步骤解析 给定一个整数数组和目标值_给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9...
python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...
- java月份下拉菜单_实现一个日期下拉菜单
这篇文章的主旨是弄清楚如何根据实际需求实现一个联动菜单以及联动菜单的原理,实例是实现一个日期选择下拉菜单.本文调试环境为IE6/firefox1.5. 首先来分析一下日期下拉菜单的需求.建议大家在写任 ...
- 【LeetCode】【Java】13. 罗马数字转整数——给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 ...
- Java不同长度数组赋值_定义一个数组时可以先不赋初值,但一定要确定数组的长度...
[多选题]识别层理主要是根据( )这几个方面来识别. [多选题]层理是通过岩石的( )在岩层垂直断面上的突变和渐变所显示出来的一种成层构造. [单选题]在使用JDBC API的PreparedStat ...
- python解椭圆方程的例题_如何用python从3个点求椭圆方程
听起来是个有趣的问题!如果你的3个点击点在同一象限内,那么由这些点定义的三角形的一个角必须是钝角.称之为B和另外两个顶点A和C.x-y定向椭圆的一般方程有4个参数.把A,B,C的x,y坐标代入椭圆方程 ...
最新文章
- ECShop 增加收藏商品排行榜功能
- SortedMap接口
- 计算机科普小知识——Win7系统32位与64位的区别,该如何选择?
- 韩流音乐爱好者的福音!SM娱乐牵手腾讯音乐
- 设计模式(十一):享元模式
- 13. Magento 后台top栏开发(二)
- eclipse debug 的断点查看和清除
- 解决PyCharm调试查看变量时一直显示collecting data
- 达梦安装与基本使用【进阶】
- 职场:因抢一个月饼,惨遭阿里开除,如今他把生活过成这样
- ping网络通不通、ttl讲解、查询ip归属地、tracert路由分析诊断
- OpenWRT/Linux多WAN带宽叠加使用iptables标记策略路由负载均衡
- 福利:tumblr五年驾龄老司机必备利器
- 尊重孩子 梅兰芳“宠溺有道”
- 安卓手机刷入面具Magisk
- hadoop3.x\2.x常用端口,和常用配置文件
- 国庆旅游3天,Python 把我的疲倦治愈了
- 基于JAVA词典设计碰到的问题,Hanlp配置自定义词典遇到的问题与解决方法
- 压缩算法(二)——QuickLZ算法
- Maven deploy时排除指定的某个module