例如:
输入 A B 2
输出 A²+2AB+B²
我的代码自动转成小写,要求次数不超过13(爆int,懒得用大数)
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Main implements ActionListener {
static JFrame jFrame = new JFrame("Java..");
static JTextField jField = new JTextField(20);
static JButton jButton = new JButton("开始分解");
static JTextArea jArea = new JTextArea(3, 20);
static int SWEIGHT = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width,
SHEIGHT = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;
static char[] chars = null;
static int[] ints = null;
static int Item = 0;
static int Max = 0;
static String Ans = "";
static int[] cc = new int[] { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600 };
void init() {
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setBounds((SWEIGHT - 270) / 2, (SHEIGHT - 200) * 2 / 5, 270, 200);
jFrame.setLayout(new FlowLayout());
jFrame.setVisible(true);
jFrame.setResizable(false);
jFrame.add(new JLabel("输入字母,最高次方小于13,以空格分隔!"));
jFrame.add(jField);
jButton.addActionListener(this);
jFrame.add(jButton);
jArea.setText("默认保存在D盘根目录");
jFrame.add(jArea);
jFrame.validate();
}
static void print() {
try {
PrintStream fout = new PrintStream("D:\\Here.html");
fout.println("<html>");
fout.println("<body>");
fout.println("<span style=\"font-size:31px\">");
boolean up = false;
for (int i = 1; i < Ans.length(); ++i) {
if (Ans.charAt(i) >= 'a' && Ans.charAt(i) <= 'z') {
up = true;
}
if (Ans.charAt(i) == '+') {
up = false;
}
if (Ans.charAt(i) >= '0' && Ans.charAt(i) <= '9') {
if (up) {
fout.print("<sup>" + Ans.charAt(i) + "</sup>");
} else {
fout.print(Ans.charAt(i));
}
} else {
fout.print(Ans.charAt(i));
}
}
fout.println("</span>");
fout.println("</body>");
fout.println("</html>");
fout.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
static int c(int x, int y) {
return cc[x] / cc[y] / cc[x - y];
}
static void dfs(int now, int mm, int tt) {
if (mm == 0) {
Ans += "+";
if (tt > 1) {
Ans += tt;
}
for (int i = 0; i < Item; ++i) {
if (ints[i] > 0) {
Ans += chars[i];
if (ints[i] > 1) {
Ans += ints[i];
}
}
}
return;
}
if (now == Item - 1) {
Ans += "+";
if (tt > 1) {
Ans += tt;
}
ints[Item - 1] += mm;
for (int i = 0; i < Item; ++i) {
if (ints[i] > 0) {
Ans += chars[i];
if (ints[i] > 1) {
Ans += ints[i];
}
}
}
ints[Item - 1] -= mm;
return;
}
for (int i = mm; i >= 0; --i) {
ints[now] += i;
int t = c(mm, i);
dfs(now + 1, mm - i, tt * t);
ints[now] -= i;
}
}
@Override
public void actionPerformed(ActionEvent e) {
jArea.setText("已保存在 D:\\Here.html");
String[] strings = jField.getText().toLowerCase().split(" ");
Item = strings.length - 1;
Max = Integer.parseInt(strings[strings.length - 1]);
if (Max > 13 || Max < 0) {
JOptionPane.showMessageDialog(jFrame, "最高次方数值不符合规范", "已终止异常", JOptionPane.WARNING_MESSAGE);
}
chars = new char[Item];
ints = new int[Item];
for (int i = 0; i < Item; ++i) {
chars[i] = strings[i].charAt(0);
}
Arrays.parallelSort(chars);
dfs(0, Max, 1);
print();
}
public static void main(String[] args) {
Main java = new Main();
java.init();
}
}