余談: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--;”の部分で約数検索を繰り返すようにした。
このコードで、一応きちんと分数の計算ができることを確認。(意外とコードがシンプルで驚いたが)
今回の約分の部分は、他の用途に使えそうな気がする。