/* (程序头部注释开始) </p><p>* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* 作 者: 李兆庆
* 完成日期: 2012 年 9 月 13 日
* 输入描述:
* 问题描述及输出: 编写一个Java应用程序,实现功能:分数的四则运算编程
* 编程思路:分数相加,两个分数分别是1/5和7/20,它们相加后得11/20。方法是先求出两个分数分母的最小公倍数,通分后,再求两个分子的和,
* 最后约简结果分数的分子和分母(如果两个分数相加的结果是4/8,则必须将其化简成最简分数的形式1/2),
* 即用分子分母的最大公约数分别除分子和分母。请用四个对话框顺序输入分子和分母,在控制台上输出其运算结果;
* 知识扩展:先求gcd(最大公约数)再求lcm(最小公倍数)。 最小公倍数等于两数之积除以最大公约数。
*例:求12和8的最小公倍数。
12和8的最大公约数为4,
12×8÷4=24 ,
所以两数的最小公倍数是24。
* 程序头部的注释结束 。
*/
import javax.swing.JOptionPane; //此函代码必须包含的哦,与用户交互框的生成有关
public class Fraction {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1=JOptionPane.showInputDialog("请输入第一个分数的分子");//用于对话框内的文字输出
int a1=Integer.parseInt(str1);
String str2=JOptionPane.showInputDialog("请输入第一个分数的分母");//用于对话框内的文字输出
int a2=Integer.parseInt(str2);
String str3=JOptionPane.showInputDialog("请输入第二个分数的分子");//用于对话框内的文字输出
int b1=Integer.parseInt(str3);
String str4=JOptionPane.showInputDialog("请输入第二个分数的分母");//用于对话框内的文字输出
int b2=Integer.parseInt(str4);
fracAdd(a1,a2,b1,b2);//结果为:11/20
fracSub(a1,a2,b1,b2);//分数相减
fracMul(a1,a2,b1,b2);//分数相乘
fractDiv(a1,a2,b1,b2);//分数相除
}
//定义分数相加函数
static void fracAdd(int first_numerator,int first_denominator,int second_numrator,int second_denominator){
//以下代码能够在控制台上显示结果
int lcm,gcd,numera,deomina;
lcm = lcm(first_denominator,second_denominator);//需要调用求最小公倍数的函数求的最小公倍数
numera = (lcm/first_denominator)*first_numerator+(lcm/second_denominator)* second_numrator;// 未化简的分子和
deomina = lcm; //未化简的分母
gcd = gcd(numera,deomina); //需要调用求最大公约数的函数
numera = numera/gcd; //化简后的分子
deomina = deomina/gcd; //化简后的分母
System.out.println("分数加法运算:"+first_numerator+"/"+first_denominator+"+"+second_numrator+"/"+second_denominator+"="+numera+"/"+deomina);//
}
//定义分数相减函数
static void fracSub(int first_numerator,int first_denominator,int second_numrator,int second_denominator){
int lcm,gcd,numera,deomina;
lcm = lcm(first_denominator,second_denominator);//需要调用求最小公倍数的函数求的最小公倍数
numera = (lcm/first_denominator)*first_numerator-(lcm/second_denominator)* second_numrator;// 未化简的分子和
deomina = lcm; //未化简的分母
gcd = gcd(numera,deomina); //需要调用求最大公约数的函数
numera = numera/gcd; //化简后的分子
deomina = deomina/gcd; //化简后的分母
System.out.println("分数减法运算:"+first_numerator+"/"+first_denominator+"-"+second_numrator+"/"+second_denominator+"="+numera+"/"+deomina);//
}
//定义分数相乘函数
static void fracMul(int first_numerator,int first_denominator,int second_numrator,int second_denominator){
int z, m,gcd,numera,deomina;
z = first_numerator * second_numrator;
m = first_denominator * second_denominator;
gcd = gcd(z,m);
numera = z / gcd;
deomina = m / gcd;
System.out.println("分数乘法运算:("+first_numerator+"/"+first_denominator+")*("+second_numrator+"/"+second_denominator+")="+numera+"/"+deomina);
}
//定义分数相除函数
static void fractDiv(int first_numerator,int first_denominator,int second_numrator,int second_denominator){
int z,a, m,gcd,numera,deomina;
a = second_denominator;
second_denominator = second_numrator;
second_numrator = a;
z = first_numerator * second_numrator;
m = first_denominator * second_denominator;
gcd = gcd(z,m);
numera = z / gcd;
deomina = m / gcd;
System.out.println("分数除法运算:("+first_numerator+"/"+first_denominator+")/("+second_numrator+"/"+second_denominator+")="+numera+"/"+deomina);
}
//求最大公约数
static int gcd(int m,int n){
int i = 2; //定义整型变量i,为循环变量
int g, min;
min = min(m,n);
g = 1; //最大公约数初始值为1
while(i <= min) //判断条件,一直循环到两个数中较小的那个结束
{
while (m % i == 0 && n % i == 0)
{
m = m / i;
n = n /i;
min( m, n );
g = g * i;
}
i++;
}
return g;
}
//求最小公倍数函数,其中最小公倍数求法参见程序头部注释“知识扩展”
static int lcm(int m,int n){
int g, l;
g = gcd(m,n); //调用求最大公约数函数,求得m,n的最大公约数。
l = m * n / g;
return l;
}
//求较小值函数
static int min(int m,int n){
if (m>n){
return n;
}
else{
return m;
}
}
}