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

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

余談:Javaで分数の計算(約分つき)

またまた、暇つぶし&復習がてら、入力された分数の足し算の解法を考えてみた。

コードは下記の通り。

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 Yakubun extends JFrame implements ActionListener {

	JTextField u1;
	JTextField u2;
	JTextField b1;
	JTextField b2;
	JLabel au;
	JLabel ab;

	public void cal() {
		//入力値の取得
		int valU1 = Integer.parseInt(u1.getText());
		int valB1 = Integer.parseInt(b1.getText());
		int valU2 = Integer.parseInt(u2.getText());
		int valB2 = Integer.parseInt(b2.getText());

		//分母と分子の単純な計算
		int u = valU1 * valB2 + valU2 * valB1;
		int b = valB1 * valB2;

		//分母と分子で小さい方をhalfにする
		int half = (u > b) ? b : u;

		//約分の主要部分
		for (int i = 2; i < half; i++) {
			if (u % i == 0 && b % i == 0) {
				u = u/i;
				b = b/i;
				i--;
			}
		}
		au.setText(Integer.toString(u));
		ab.setText(Integer.toString(b));
	}

	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();
		if (cmd.equals("calc")) {
			cal ();
		}
	}

	Yakubun () {
		JButton button = new JButton ("Calc");
		button.addActionListener (this);
		button.setActionCommand("calc");
		JLabel line1 = new JLabel ("-------");
		JLabel line2 = new JLabel ("-------");
		JLabel line3 = new JLabel ("-------");
		JLabel plus = new JLabel ("+");
		JLabel equal = new JLabel ("=");
		au = new JLabel ();
		ab = new JLabel ();
		u1 = new JTextField ();
		u2 = new JTextField ();
		b1 = new JTextField ();
		b2 = new JTextField ();
		button.setBounds (50, 100, 100, 30);
		u1.setBounds (30, 20, 30, 30);
		b1.setBounds(30, 60, 30, 30);
		line1.setBounds(30, 48, 30, 10);
		line2.setBounds(85, 48, 30, 10);
		line3.setBounds(150, 48, 30, 10);
		plus.setBounds (70, 40, 30, 30);
		equal.setBounds(130, 45, 30, 20);
		u2.setBounds(85, 20, 30, 30);
		b2.setBounds(85, 60, 30, 30);
		au.setBounds(150, 20, 30, 30);
		ab.setBounds(150, 60, 30, 30);
		JPanel pane = new JPanel ();
		pane.setLayout(null);
		pane.add(button);
		pane.add(u1);
		pane.add(u2);
		pane.add(b1);
		pane.add(b2);
		pane.add(line1);
		pane.add(line2);
		pane.add(line3);
		pane.add(plus);
		pane.add(equal);
		pane.add(au);
		pane.add(ab);
		getContentPane().add(pane);
	}

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

このコードでは、フレーム内のJTextFieldに分数を入力するようにした。


分数の計算をするにあたり、まず単純に下記の部分で分母を掛け合って約分前の回答を得て、

      //分母と分子の単純な計算
      int u = valU1 * valB2 + valU2 * valB1;
      int b = valB1 * valB2;		

下記の部分で約分を行っている。

      //約分の主要部分
      for (int i = 2; i < half; i++) {
	if (u % i == 0 && b % i == 0) {
	   u = u/i;
	   b = b/i;
	   i--;
	}
      }

下記のように、約数の検索範囲は分母と分子の小さい方までにした。

   //分母と分子で小さい方をhalfにする
     int half = (u > b) ? b : u;

   for (int i = 2; i < half; i++) {

また、"2"のように約数として複数持つ可能性がある数字があるため、“i--;”の部分で約数検索を繰り返すようにした。
このコードで、一応きちんと分数の計算ができることを確認。(意外とコードがシンプルで驚いたが)

今回の約分の部分は、他の用途に使えそうな気がする。