Java实现分数的四则运算

自己的写法

markdown太久没写格式不会用了--将就着看

  • Fraction.java

package com.lanou; public class Fraction { private int numerator1; //定义属性:分子1
private int denominator1; //定义属性:分母1 private String operator; //定义属性:运算符 private int numerator2; //定义属性:分子2
private int denominator2; //定义属性:分母2 //构造方法
//constructor生成 public Fraction(int numerator1, int denominator1, String operator, int numerator2, int denominator2) {
this.numerator1 = numerator1;
this.denominator1 = denominator1;
this.operator = operator;
this.numerator2 = numerator2;
this.denominator2 = denominator2;
} //加法
public void addition() { int x = numerator1 * denominator2 + numerator2 * denominator1;
int y = denominator1 * denominator2;
gcd(x,y); } //减法
public void subtraction() { int x = numerator1 * denominator2 - numerator2 * denominator1;
int y = denominator1 * denominator2;
gcd(x,y);
} //乘法
public void multiplication(){ int x = numerator1 * numerator2;
int y = denominator1 * denominator2;
gcd(x,y);
} //除法
public void division(){ int x = numerator1 * denominator2;
int y = denominator1 * numerator2;
gcd(x,y); } //欧几里得+判断输出
public int gcd(int m,int n) { //定义四个空变量
int r;
int t;
int u;
int w; //t和w用来存储分子和分母的初始数据
t = m;
w = n; //求最大公因数
while (n != 0) {
r = m % n;
m = n;
n = r;
}
//循环结束后此时m即为最大公因数
//放个u = m看着方便
u = m; //分子分母分别除以最大公因数
t = t / u;
w = w / u; //判断+输出
//分子分母都为1 直接输出1
if(t == 1 && w == 1){ System.out.println("1");
}
//分子为0 分母不为0 直接输出0
else if(t == 0 && w != 0){ System.out.println("0");
}
//分子分母都不为0且不为1 直接输出
else { System.out.println(t + "/" + w);
} return 0; } }

  • MainClass.java

package com.lanou;
import java.util.Scanner; public class MainClass { public static void main(String[] args) { System.out.println("请输入按分子1分母1运算符分子2分母2的形式输入数据");
Scanner scanner = new Scanner(System.in); int a = scanner.nextInt();
int b = scanner.nextInt();
String o = scanner.next();
int c = scanner.nextInt();
int d = scanner.nextInt(); //判断分母是否为0 若为0重新输入 不为0继续判断
if (b == 0 || d == 0){ System.out.println("分母不能为零,请重新输入"); a = scanner.nextInt();
b = scanner.nextInt();
o = scanner.next();
c = scanner.nextInt();
d = scanner.nextInt();
} //判断o中是否是运算符
if (!o.equals("+") && !o.equals("-") && !o.equals("*") && !o.equals("/")){ System.out.println("运算符输入错误,请重新输入"); a = scanner.nextInt();
b = scanner.nextInt();
o = scanner.next();
c = scanner.nextInt();
d = scanner.nextInt();
} Fraction fraction = new Fraction(a, b, o, c, d); if (o.equals("+")){ fraction.addition();
}
else if (o.equals("-")){ fraction.subtraction();
}
else if (o.equals("*")){ fraction.multiplication();
}
else if (o.equals("/")){ fraction.division();
} }
}

大仁哥的写法


/**
* @author lizhongren1. */
public class Fraction { // 分子(numerator) private int ntNum; // 分母(Denominator) private int doNum; // 构造方法, 这里没写空的构造方法, 换句话说就是要求必须要有分子和分母. public Fraction(int ntNum, int doNum) { this.ntNum = ntNum; this.doNum = doNum; if (doNum == 0){
// 分母不能为0 System.out.println("分母不能为0, 已经改为1"); this.doNum = 1;
} // 创建新分数之后进行约分处理 reduce();
} // 分数加法 public Fraction add(Fraction f){ // a/b + c/d // 生成新的分子: a * d + b * c int newNt = ntNum * f.getDoNum() + doNum * f.getNtNum(); // 生成新的分母: b * d int newDo = doNum * f.getDoNum(); // 使用新的分子分母创建一个新的分数对象 Fraction newF = new Fraction(newNt, newDo); return newF;
} // 约分方法: 把分数化为最简分数, 即 6/12 化为 1/2 // 此方法和下一个方法都不想让外部调用, 因此设置为private private void reduce(){ // 获得最大公约数 int m = maxDe(ntNum, doNum); ntNum = ntNum / m; doNum = doNum / m;
} // 最大公约数: 使用辗转相除法(又名欧几里德算法, 别问我怎么来的, 去问欧几里德) private int maxDe(int a, int b){ while(b != 0)
{ int r = a % b; a = b; b = r; } return a; } // 输出字符串, 按照 分子/分母的形式输出 @Override public String toString() { // 分子为0时输出0 if (ntNum == 0){ return "0"; } // 分子分母相同时输出1 if (ntNum == doNum){ return "1";
} // 其余方式按 分子/分母 输出 return ntNum + "/" + doNum;
} // getter/setter方法 public int getNtNum() { return ntNum;
} public void setNtNum(int ntNum) { this.ntNum = ntNum;
} public int getDoNum() { return doNum;
} public void setDoNum(int doNum) { this.doNum = doNum;
} // main方法测试 public static void main(String[] args) { Fraction f1 = new Fraction(1,3); Fraction f2 = new Fraction(4,9); // 分数f1 加上 分数f2 Fraction nf = f1.add(f2); System.out.println(nf); System.out.println(nf.add(new Fraction(9,12)));
}
}

  • 输入与输出

  • 测试数据

  • 输入格式:分子1 回车 分母1 回车 运算符 回车 分子2 回车 分母2 回车

  • 1/4+1/4

  • 0/4+0/4

  • 4/0+4/0

2019.3.13 Java实现分数的四则运算的更多相关文章

  1. 2019.3.13 Java的特性——继承

    继承 面向对象编程(OOP)三大特征:继承,封装,多态 目的:为了减少重复代码,避免复制粘贴 创建父类Animal public class Animal { private String name; ...

  2. 2019/05/13 JAVA虚拟机堆内存调优

    -Xms4000m 堆内存初始值 * -Xmx4000m 堆内存最大值 * -XX:+PrintGCDetails 打印GC信息 * -XX:+UseSerialGC 使用串行GC * -XX:+Pr ...

  3. 2019秋招Java面经(未完待续)

    2019秋招Java面经(凭记忆回忆, 可能不准) 随着我们从大三升到大四...秋招也开始了. 秋招进行的还比较顺利, 刚开始没几天, 我的秋招就结束了. 到现在我玩了差不多十多天了, 总想着总结一下 ...

  4. 每日一练ACM 2019.04.13

    2019.04.13 第1002题:A+B Proble Ⅱ Problem DescriptionI have a very simple problem for you. Given two in ...

  5. JAVA实现简单的四则运算

    GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...

  6. Java入门练习之四则运算

    Java入门练习之四则运算 项目目的 制作一个Java控制台程序,让他可以随机生成四则运算,并针对用户的输入判断对错. 项目分析 该项目本质上是一个四则运算出题器,可以创建一个Question类,其中 ...

  7. 【Java】-NO.13.Java.1.Foundation.1.001-【Java IO】-

    1.0.0 Summary Tittle:[Java]-NO.13.Java.1.Foundation.1.001-[Java IO]- Style:Java Series:Foundation Si ...

  8. Java-Runoob-高级教程-实例-方法:13. Java 实例 – for 和 foreach循环使用

    ylbtech-Java-Runoob-高级教程-实例-方法:13. Java 实例 – for 和 foreach循环使用 1.返回顶部 1. Java 实例 - for 和 foreach循环使用 ...

  9. Java-Runoob-高级教程-实例-数组:13. Java 实例 – 数组交集

    ylbtech-Java-Runoob-高级教程-实例-数组:13. Java 实例 – 数组交集 1.返回顶部 1. Java 实例 - 数组交集  Java 实例 以下实例演示了如何使用 reta ...

随机推荐

  1. python文件处理os模块

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...

  2. 第十课,ROS仿真2

    Rviz 属性 1.下面以turtlebot_stage inRviz为例 首先安装 sudo apt-get install ros-indigo-turtlebot-simulator 运行 ro ...

  3. Request[]与Request.Params[] 差别

    Request[]与Request.Params[] ,这二个属性都可以让我们方便地根据一个KEY去[同时搜索]QueryString.Form.Cookies 或 ServerVariables这4 ...

  4. 编写高质量代码改善C#程序的157个建议——建议44:理解委托中的协变

    建议44:理解委托中的协变 委托中的泛型变量天然是部分支持协变的.为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHa ...

  5. 编写高质量代码改善C#程序的157个建议——建议43:让接口中的泛型参数支持协变

    建议43:让接口中的泛型参数支持协变 除了上一建议中提到的使用泛型参数兼容接口不可变性外,还有一种办法是为接口中的泛型声明加上out关键字来支持协变,如下所示: interface ISalary&l ...

  6. mysql索引及多表查询

    注意where,group by ,having,order by, limit 等的顺序. 主表是被绑定的表,子表是添加了外键了的表,注意,在创建表的时候可以添加外键,也可以创建完了以后添加外键. ...

  7. C# 多线程操作实例

    1.多线程操作 一旦打开线程就必须记得关闭 1.第一部分 这是个数字叠加小功能 private void CountTo(int countTo, CancellationToken ct) { ; ...

  8. RealSense R400系列深度相机的图像获取保存和格式转换

    关于RealSense的基础使用的博文用的库有点混杂,挺多博文都是早期maneger的那个库,对那个不是很了解,主要记录一下使用最新的函数库的基础使用. 相机型号:RealSense R435 使用函 ...

  9. session相关

    判断session是否已失效: HttpSession session=request.getSession(false); getSession(boolean)相比于getSession()更安全 ...

  10. oracle转义用单引号

    参考:https://blog.csdn.net/learning_oracle_lh/article/details/46639507