写一个程序判断二次方程是否满足十字交叉法

 

判断二次方程是否满足十字相乘法

一元二次方程:$ax^2+bx+c$

十字相乘法算法描述

  • 首先把系数a分成两个数$a_1\times a_2$的乘积形式,c分成两个数$c_1\times c_2$的乘积形式
  • 如果$a_1\times c_2+a_1\times c_1=b$则满足十字交叉法
  • 把公式写成$(a_1x+c_1)(a_2x+c_2)$即可

如何把一个数分成两个数的乘积

如把常系数$c$分成$c_1\times c_2$时,我可以先取$c_1=1$,则$c_2=c \div c_1$

初步实现

java代码如下:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package yiyuanercifangcheng;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test
{
public static void main(String[] args)
{
// String text="ax^2+bx+c";
// String text = "x^2+3x-4";
// String text = "x^2+4x+4";
// String text = "x^2+10x+25";
// String text = "x^2-10x+25";
// String text = "x^2+8x+16";
String text = "x^2-8x+16";
System.out.println("二次方程:" + text);
Pattern fun = Pattern.compile("(.*?)x\\^2(.*?)x(.*?)");
Matcher matcher = fun.matcher(text);
int[] a = new int[3];
int b = 0;
int[] c = new int[3];
// a是否已经分解
boolean isADiv = false;
// C是否已经分解
boolean isCDiv = false;
if (matcher.matches())
{
String astr = matcher.group(1), bstr = matcher.group(2),
cstr = matcher.group(3);
// 如果有正号则移除正号
bstr = bstr.replaceAll("\\+", "");
// 如果有正号则移除正号
cstr = cstr.replaceAll("\\+", "");
// 这说明系数1忽略没有写
if (astr == null || astr.equals(""))
{
a[0] = 1;
a[1] = 1;
a[2] = 1;
isADiv = true;
} else
{
a[0] = Integer.parseInt(astr);
}
// 这说明系数1忽略没有写
if (bstr == null || bstr.equals(""))
{
b = 1;
} else
{
b = Integer.parseInt(bstr);
}
c[0] = Integer.parseInt(cstr);
}
// a=1的情况
if (isADiv)
{
for (int i = 1, first = -Math.abs(c[0]), length = 2
* Math.abs(c[0]); i < length; i++)
{
c[1] = first++;
// 跳过分母为0的情况
if (c[1] == 0)
continue;
c[2] = c[0] / c[1];
// 判断是否能整除
if (c[1] * c[2] == c[0])
{
System.out.print("可以整除: " + c[1] + " * " + c[2] + " = "
+ (c[1] * c[2]) + " =" + c[0]);
if ((a[1] * c[2] + a[2] * c[1]) == b)
{
System.out.print(",(" + a[1] + "*" + c[2] + "+" + a[2]
+ "*" + c[1] + ")=" + b);
System.out.print(",满足十字相乘法: ");
System.out.println(printResult(a, c));
// 得到结果,终止循环
break;
}
System.out.println();
} else
{
System.out.println("不可整除: " + c[1] + " * " + c[2] + " = "
+ (c[1] * c[2]) + " !=" + c[0]);
// 跳过不能整除的情况
continue;
}
}
}
}
/**
* 拼接公式
* @param a x^2的系数数组
* @param c 常数c的系数数组
* return 拼接好的形如(a_1x+c_1)(a_2x+c_2)公式
*/
public static String printResult(int[] a, int[] c)
{
StringBuffer sb = new StringBuffer();
sb.append("(");
// 如果系数是1或者-1
if (Math.abs(a[1]) == 1)
{
// 如果是-1则显示负号
if (a[1] == -1)
{
sb.append("-");
}
// 如果是+1则什么都不显示
} else
{
sb.append(a[1]);
}
sb.append("x");
if (c[1] >= 0)
{
System.out.print("+");
sb.append("+");
}
sb.append(c[1] + ")(");
// 如果系数是1或者-1
if (Math.abs(a[1]) == 1)
{
// 如果是-1则显示负号
if (a[1] == -1)
{
sb.append("-");
}
// 如果是+1则什么都不显示
} else
{
sb.append(a[1]);
}
sb.append("x");
if (c[2] >= 0)
{
sb.append("+");
}
sb.append(c[2] + ")");
return sb.toString();
}
}

这个代码只能满足a=1的情况,a!=1的情况我还没想好怎么弄,可能需要先对A来一个循环,

本文链接: 写一个程序判断二次方程是否满足十字交叉法