生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

余談:Javaで因数分解をしてみる

またまた、暇つぶし。
今回は入力した2次式の因数分解をするコードを書いてみた。(但し ax2 - cの形式の因数分解は出来ない)

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Factorization extends JFrame implements ActionListener {

	JTextField ta;
	JTextField tb;
	JTextField tc;
	JLabel a;
	JLabel b;
	JLabel c;
	JLabel d;
	int valA;
	int valB;
	int valC;
	int aa;
	int ab;
	int ac;
	int ad;

	public void Analysis () {
		for (int i = 1; i < Math.abs(valA); i++) {
			if (valA % i == 0) {
				for (int  j = 1; j < Math.abs(valC); j++) {
					if (valC % j == 0 && (valB == (i * j + valA/i * valC/j)))  {
						aa = i;
						ab = valC/j;
						ac = valA/i;
						ad = j;
					} else if (valC % j == 0 && (valB == (i * valC/j + valA/i * j)))  {
						aa = i;
						ab = j;
						ac = valA/i;
						ad = valC/j;
					}
				}
			}
		}
	}

	//ax2 + (-b) x + cの場合
	public void Analysis2 () {
		for (int i = 1; i < Math.abs(valA); i++) {
			if (valA % i == 0) {
				for (int  j = 1; j < Math.abs(valC); j++) {
					if (valC % j == 0 && (Math.abs(valB) == (i * j + valA/i * valC/j)))  {
						aa = i;
						ab = (-1)*valC/j;
						ac = valA/i;
						ad = (-1)*j;
					} else if (valC % j == 0 && (Math.abs(valB) == (i * valC/j + valA/i * j)))  {
						aa = i;
						ab = (-1)*j;
						ac = valA/i;
						ad = (-1)*valC/j;
					}
				}
			}
		}
	}

	// -a x2 + bx + cの場合
	public void Analysis3 () {
		valA = (-1) * valA;
		valB = (-1) * valB;
		valC = (-1) * valC;

		for (int i = 1; i < Math.abs(valA); i++) {
			if (valA % i == 0) {
				for (int  j = 1; j < Math.abs(valC); j++) {
					if (valC % j == 0 && (valB == (i * j + valA/i * valC/j)))  {
						aa = (-1) * i;
						ab = (-1)*valC/j;
						ac = valA/i;
						ad = j;
					} else if (valC % j == 0 && (valB == (i * valC/j + valA/i * j)))  {
						aa = (-1) *i;
						ab = (-1)*j;
						ac = valA/i;
						ad = valC/j;
					}
				}
			}
		}
	}
	
	// -a x2 + bx - cの場合
	public void Analysis4 () {
		valA = (-1) * valA;
		valB = (-1) * valB;
		valC = (-1) * valC;

		Analysis2();
		
		aa = (-1)*aa;
		ab = (-1)*ab;
	}

	public void Cal () {
		valA = Integer.parseInt(ta.getText());
		valB = Integer.parseInt(tb.getText());
		valC = Integer.parseInt(tc.getText());

		if (valA > 0 && valB < 0 && valC > 0) {
			Analysis2 ();
		} else if (valA < 0){
			if (valB > 0 && valC < 0) {
				Analysis4 ();
			} else {
				Analysis3 ();
			}
		} else {
			Analysis();
		}

		a.setText(Integer.toString(aa));
		b.setText(Integer.toString(ab));
		c.setText(Integer.toString(ac));
		d.setText(Integer.toString(ad));

	}

	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();

		if (cmd.equals("Cal")) {
			Cal();
		}
	}

	Factorization () {
		JButton button = new JButton ("Cal");
		button.addActionListener(this);
		button.setActionCommand("Cal");
		ta = new JTextField ();
		tb = new JTextField ();
		tc = new JTextField ();
		JLabel la = new JLabel ("x2 + ");
		JLabel lb = new JLabel ("x + ");
		JLabel eq = new JLabel ("= ");
		JLabel k1 = new JLabel ("(");
		JLabel k2 = new JLabel (")");
		JLabel k3 = new JLabel ("(");
		JLabel k4 = new JLabel (")");
		JLabel x1 = new JLabel ("x");
		JLabel p1 = new JLabel ("+");
		JLabel x2 = new JLabel ("x");
		JLabel p2 = new JLabel ("+");
		a = new JLabel ();
		b = new JLabel ();
		c = new JLabel ();
		d = new JLabel ();
		button.setBounds(80, 90, 90, 30);
		ta.setBounds(30, 10, 30, 30);
		tb.setBounds(92, 10, 30, 30);
		tc.setBounds(150, 10, 30, 30);
		a.setBounds(42, 50, 40, 30);
		b.setBounds(92, 50, 40, 30);
		c.setBounds (142, 50, 40, 30);
		d.setBounds(188, 50, 40, 30);
		k1.setBounds (34, 50, 30, 30);
		k2.setBounds(120, 50, 30, 30);
		k3.setBounds(130, 50, 30, 30);
		k4.setBounds(216, 50, 30, 30);
		x1.setBounds(70, 50, 30, 30);
		x2.setBounds(166, 50, 30, 30);
		p1.setBounds(80, 50, 30, 30);
		p2.setBounds(176, 50, 30, 30);
		la.setBounds(62, 10, 30, 30);
		lb.setBounds(124, 10, 30, 30);
		eq.setBounds(25, 50, 30, 30);
		JPanel pane = new JPanel ();
		pane.setLayout(null);
		pane.add(button);
		pane.add(a);
		pane.add(b);
		pane.add(c);
		pane.add(d);
		pane.add(ta);
		pane.add(tb);
		pane.add(tc);
		pane.add(la);
		pane.add(lb);
		pane.add(eq);
		pane.add(k1);
		pane.add(k2);
		pane.add(k3);
		pane.add(k4);
		pane.add(p1);
		pane.add(p2);
		pane.add(x1);
		pane.add(x2);
		getContentPane().add(pane);
	}

	public static void main(String[] args) {
		Factorization frame = new Factorization ();
		frame.setBounds (100, 100, 260, 180);
		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

ものすごい無理やり感のあるコードになったが、とりあえず因数分解できることは確認。

本コードでは、(1)ax2 - bx + c、(2)-ax2 + b + c、(3)その他の3通りに場合分けした。
(-ax2 + b + cを場合分けしないと、うまく計算してくれなかった理由は不明だが)

もう少しシンプルな方法が有りそうだが、現状の知識ではこんなものだろう。