java整数类和自然数类的简单实现

只是简单实现了构造方法、加法减法、输出和比较的方法。
代码有很多地方重复,比较乱,初学者水平。
为了实现多位计算,对数字是用数组列表记录每一位。

private int length;          //记录数字的长度
private ArrayList<Integer> numbers;       //记录数字的每一位
import java.util.ArrayList;public class MyNumber {public static void main(String[] args) {//成员方法的测试MyNaturalNumbers naturalNumber1 = new MyNaturalNumbers("1000000000000000000000");System.out.print("自然数1长度:" + naturalNumber1.getLength() + " " + "自然数1:");naturalNumber1.outputNumber();MyNaturalNumbers naturalNumber2 = new MyNaturalNumbers("2222222222222222222222");System.out.print("自然数2长度:" + naturalNumber2.getLength() + " " + "自然数2:");naturalNumber2.outputNumber();MyNaturalNumbers naturalNumber3 = new MyNaturalNumbers("1111111111111111111199");System.out.print("自然数3数字长度:" + naturalNumber3.getLength() + " " + "自然数3:");naturalNumber3.outputNumber();System.out.println("判断自然数1和2的大小(1前者大,0相等,-1后者大):" + naturalNumber1.equals(naturalNumber2));System.out.print("自然数1加上自然数2后的结果:");naturalNumber1.add(naturalNumber2);naturalNumber1.outputNumber();System.out.print("自然数2减去自然数3后的结果:");naturalNumber2.reduce(naturalNumber3);naturalNumber2.outputNumber();MyInteger myInteger1 = new MyInteger("10000000000123456789");System.out.print("整数1长度:" + myInteger1.getLength() + " " + "整数1:");myInteger1.outputNumber();MyInteger myInteger2 = new MyInteger("-22223333444455556666");System.out.print("整数2长度:" + myInteger2.getLength() + " " + "整数2:");myInteger2.outputNumber();MyInteger myInteger3 = new MyInteger("-66666666666666666666");System.out.print("整数3长度:" + myInteger3.getLength() + " " + "整数3:");myInteger3.outputNumber();System.out.print("整数1减去整数2后的结果:");myInteger1.reduce(myInteger2);myInteger1.outputNumber();System.out.println("判断自然数1和整数1的大小(1前者大,0相等,-1后者大):" + naturalNumber1.equals(myInteger1));System.out.println("判断整数1和整数2大小(1前者大,0相等,-1后者大):" + myInteger1.equals(myInteger2));System.out.println("判断整数1和自然数1大小(1前者大,0相等,-1后者大):" + myInteger1.equals(naturalNumber1));System.out.println("把整数3转化会字符串格式化:"+myInteger3.toString());}
}class Number {private int length;//数字的长度private ArrayList<Integer> numbers;//记录数字的每一位public int getLength() {return this.length;}public ArrayList<Integer> getNumbers() {return numbers;}
}class MyInteger extends Number {private int length;//数字的长度private ArrayList<Integer> numbers;//记录数字的每一位public void setLength(int length) {this.length = length;}public void setNumbers(ArrayList<Integer> numbers) {this.numbers = numbers;}public int getLength() {return this.length;}public ArrayList<Integer> getNumbers() {return numbers;}//构造方法public MyInteger() {this.length = 0;this.numbers = new ArrayList<>();}public MyInteger(String number) {numbers = new ArrayList<>();if (number.length() == 1 && number.equals(0)) {this.length = 0;this.numbers.add(0);} else {int i = 0;for (int j = number.length() - 1; j >= 0; j--) {if (number.charAt(j) == '-') {this.numbers.add(Integer.valueOf(number.charAt(0)));i++;} else if (number.charAt(j) != ',')this.numbers.add(Integer.valueOf(number.charAt(j)) - 48);elsei++;}this.length = number.length() - i;}}public MyInteger(MyNaturalNumbers myNaturalNumbers) {this.length = myNaturalNumbers.getLength();this.numbers = myNaturalNumbers.getNumbers();}//输出数字public void outputNumber() {for (int i = numbers.size() - 1; i >= 0; i--) {if (numbers.get(i) == 45)System.out.print('-');elseSystem.out.print(numbers.get(i));}System.out.println();}//数字相加方法public void add(MyInteger myInteger) {//加的数为0if (myInteger.length == 0) {return;}//暂时存放结果ArrayList<Integer> resultNumber = new ArrayList<>();int longLength = this.length > myInteger.length ? this.length : myInteger.length;int shortLength = this.length < myInteger.length ? this.length : myInteger.length;int val1;int val2;int carry = 0;int borrowCur = 0;int borrowNext;int temp1;int temp2;//减数和被减数的正负符号int minuendSign = this.numbers.get(this.numbers.size() - 1) == '-' ? -1 : 1;int subtractionSign = myInteger.numbers.get(myInteger.numbers.size() - 1) == '-' ? -1 : 1;//异号相加的情况//绝对值大小比较int compareAbs = this.equalsAbs(myInteger);if (minuendSign * subtractionSign < 0) {if (compareAbs == 0) {resultNumber.add(0);this.length = 0;this.numbers = resultNumber;return;}for (int i = 0; i < longLength; i++) {if (i < shortLength) {val1 = this.numbers.get(i);val2 = myInteger.numbers.get(i);} else if (i >= shortLength && i < longLength) {if (compareAbs == 1) {val1 = this.numbers.get(i);val2 = 0;} else {val2 = myInteger.numbers.get(i);val1 = 0;}} else {val1 = 0;val2 = 0;}//前者绝对值大,相减为正数if (compareAbs == 1) {borrowNext = val1 - val2 - borrowCur >= 0 ? 0 : 1;temp1 = val1 - borrowCur - val2 + borrowNext * 10;borrowCur = borrowNext;resultNumber.add(temp1);}//后者绝对值大,相减为负数if (compareAbs == -1) {borrowNext = val2 - val1 - borrowCur >= 0 ? 0 : 1;temp1 = val2 - borrowCur - val1 + borrowNext * 10;borrowCur = borrowNext;resultNumber.add(temp1);}}//去除高位0int indexZero = resultNumber.size() - 1;while (resultNumber.get(indexZero) == 0) {resultNumber.remove(resultNumber.size() - 1);indexZero--;}//为负则放入负号,结果赋值if ((compareAbs == -1 && minuendSign == 1) || (compareAbs == 1 && minuendSign == -1)) {resultNumber.add(45);this.length = resultNumber.size() - 1;} else {this.length = resultNumber.size();}this.numbers = resultNumber;}//同号相加的情况if (minuendSign * subtractionSign > 0) {for (int i = 0; (i < longLength) || carry != 0; i++) {if (i < shortLength) {val1 = this.numbers.get(i);val2 = myInteger.numbers.get(i);} else if (i >= shortLength && i < longLength) {if (this.length > myInteger.length) {val1 = this.numbers.get(i);} else {val1 = myInteger.numbers.get(i);}val2 = 0;} else {val1 = 0;val2 = 0;}temp2 = val1 + val2 + carry;carry = temp2 / 10;resultNumber.add(temp2 % 10);}if (minuendSign == 1)this.length = resultNumber.size();else {resultNumber.add(45);this.length = resultNumber.size() - 1;}this.numbers = resultNumber;}}//数字相减方法public void reduce(MyInteger myInteger) {MyInteger temp = new MyInteger();temp.length = myInteger.length;temp.numbers = myInteger.numbers;if (myInteger.numbers.get(myInteger.numbers.size() - 1) == '-') {temp.numbers.remove(myInteger.numbers.size() - 1);} else {temp.numbers.add(45);}this.add(temp);}//字符串格式化public String toString() {String number = "";for (int i = this.numbers.size() - 1; i >= 0; i--) {if (this.numbers.get(i) == 45)number = number + '-';elsenumber = number + this.numbers.get(i);}return number;}//比较两个整数的大小public int equals(MyInteger myInteger) {int myInteger2Size = myInteger.getNumbers().size();int myInteger1Size = this.numbers.size();if (myInteger.getNumbers().get(myInteger2Size - 1) == '-' && this.numbers.get(myInteger1Size - 1) != '-')return 1;else if (myInteger.getNumbers().get(myInteger2Size - 1) == '-' && this.numbers.get(myInteger1Size - 1) != '-')return -1;else if (myInteger.getNumbers().get(myInteger2Size - 1) != '-' && this.numbers.get(myInteger1Size - 1) != '-') {if (this.length > myInteger.getLength())return 1;else if (this.length < myInteger.getLength())return -1;else {for (int i = this.length - 1; i >= 0; i--) {if (this.numbers.get(i) > myInteger.getNumbers().get(i))return 1;else if (this.numbers.get(i) < myInteger.getNumbers().get(i))return -1;elsecontinue;}}return 0;} else {if (this.length > myInteger.getLength())return -1;else if (this.length < myInteger.getLength())return 1;else {for (int i = this.length - 1; i >= 0; i--) {if (this.numbers.get(i) > myInteger.getNumbers().get(i))return -1;else if (this.numbers.get(i) < myInteger.getNumbers().get(i))return 1;elsecontinue;}}return 0;}}//比较两个整数绝对值的大小public int equalsAbs(MyInteger myInteger) {if (this.length > myInteger.length)return 1;else if (this.length < myInteger.length)return -1;else {for (int i = this.length - 1; i >= 0; i--) {if (this.numbers.get(i) > myInteger.numbers.get(i))return 1;else if (this.numbers.get(i) < myInteger.numbers.get(i))return -1;elsecontinue;}}return 0;}//比较一个整数和一个自然数的大小public int equals(MyNaturalNumbers myNaturalNumbers) {int myIntegerSize = this.numbers.size();if (this.numbers.get(myIntegerSize - 1) == '-')return -1;else if (this.length > myNaturalNumbers.getLength())return 1;else if (this.length < myNaturalNumbers.getLength())return -1;else {for (int i = this.length - 1; i >= 0; i--) {if (this.numbers.get(i) > myNaturalNumbers.getNumbers().get(i))return 1;else if (this.numbers.get(i) < myNaturalNumbers.getNumbers().get(i))return -1;elsecontinue;}}return 0;}
}class MyNaturalNumbers extends Number {public void setLength(int length) {this.length = length;}public int getLength() {return this.length;}public ArrayList<Integer> getNumbers() {return numbers;}public void setNumbers(ArrayList<Integer> numbers) {this.numbers = numbers;}private int length;//数字的长度private ArrayList<Integer> numbers;//记录数字的每一位//构造方法public MyNaturalNumbers() {this.length = 0;this.numbers = new ArrayList<>();}public MyNaturalNumbers(String number) {numbers = new ArrayList<>();//为负数提示错误if (number.charAt(0) == '-') {System.out.println("自然数不能为负");this.length = -1;}//为0else if (number.length() == 1 && number.equals(0)) {this.length = 0;this.numbers.add(0);} else {//为正整数int i = 0;for (int j = number.length() - 1; j >= 0; j--) {if (number.charAt(j) != ',')this.numbers.add(Integer.valueOf(number.charAt(j)) - 48);elsei++;}this.length = number.length() - i;}}//输出数字public void outputNumber() {for (int i = numbers.size() - 1; i >= 0; i--) {System.out.print(numbers.get(i));}System.out.println();}//数字相加方法public void add(MyNaturalNumbers myNaturalNumbers) {MyNaturalNumbers res = new MyNaturalNumbers();int val1;int val2;int temp;int carry = 0;int maxLength = this.length > myNaturalNumbers.length ? this.length : myNaturalNumbers.length;int minLength = this.length < myNaturalNumbers.length ? this.length : myNaturalNumbers.length;for (int i = 0; (i < maxLength) || carry != 0; i++) {if (i < minLength) {val1 = this.numbers.get(i);val2 = myNaturalNumbers.numbers.get(i);} else if (i >= minLength && i < maxLength) {if (this.length > myNaturalNumbers.length) {val1 = this.numbers.get(i);} else {val1 = myNaturalNumbers.numbers.get(i);}val2 = 0;} else {val1 = 0;val2 = 0;}temp = val1 + val2 + carry;carry = temp / 10;res.numbers.add(temp % 10);}res.length = res.numbers.size();this.numbers = res.numbers;this.length = res.length;}//数字相减方法public MyInteger reduce(MyNaturalNumbers myNaturalNumbers) {MyInteger res = new MyInteger();int val1;int val2;int borrowCur = 0;int borrowNext;int temp;int compare = this.equals(myNaturalNumbers);ArrayList<Integer> resultNumber = new ArrayList<>();int maxLength = this.length > myNaturalNumbers.length ? this.length : myNaturalNumbers.length;int minLength = this.length < myNaturalNumbers.length ? this.length : myNaturalNumbers.length;//两数相等,相减为0if (compare == 0) {resultNumber.add(0);res.setLength(0);res.setNumbers(resultNumber);this.length = res.getLength();this.numbers = res.getNumbers();return res;}for (int i = 0; i < maxLength; i++) {if (i < minLength) {val1 = this.numbers.get(i);val2 = myNaturalNumbers.numbers.get(i);} else if (i >= minLength && i < maxLength) {if (compare == 1) {val1 = this.numbers.get(i);val2 = 0;} else {val2 = myNaturalNumbers.numbers.get(i);val1 = 0;}} else {val1 = 0;val2 = 0;}//前者大,相减为正数if (compare == 1) {borrowNext = val1 - val2 - borrowCur >= 0 ? 0 : 1;temp = val1 - borrowCur - val2 + borrowNext * 10;borrowCur = borrowNext;resultNumber.add(temp);}//后者大,相减为负数if (compare == -1) {borrowNext = val2 - val1 - borrowCur >= 0 ? 0 : 1;temp = val2 - borrowCur - val1 + borrowNext * 10;borrowCur = borrowNext;resultNumber.add(temp);}}//去除高位0int indexZero = resultNumber.size() - 1;while (resultNumber.get(indexZero) == 0) {resultNumber.remove(resultNumber.size() - 1);indexZero--;}//为负则放入负号if (compare == -1) {resultNumber.add(45);}//结果对象赋值res.setNumbers(resultNumber);if (resultNumber.get(resultNumber.size() - 1) == 45) {res.setLength(resultNumber.size() - 1);System.out.println("运算结果不为自然数,返回值为负整数");} else {res.setLength(resultNumber.size());this.length = res.getLength();this.numbers = res.getNumbers();}return res;}//通过自然数创建整数public MyInteger toMyInteger() {MyInteger myInteger = new MyInteger();myInteger.setLength(this.length);myInteger.setNumbers(this.numbers);return myInteger;}//字符串格式化public String toString() {String number = "";for (int i = this.numbers.size() - 1; i >= 0; i--) {number = number + this.numbers.get(i);}return number;}//比较两个自然数大小public int equals(MyNaturalNumbers myNaturalNumbers) {if (this.length > myNaturalNumbers.length)return 1;else if (this.length < myNaturalNumbers.length)return -1;else {for (int i = this.length - 1; i >= 0; i--) {if (this.numbers.get(i) > myNaturalNumbers.numbers.get(i))return 1;else if (this.numbers.get(i) < myNaturalNumbers.numbers.get(i))return -1;elsecontinue;}}return 0;}//比较自然数与整数的大小public int equals(MyInteger myInteger) {int myIntegerSize = myInteger.getNumbers().size();if (myInteger.getNumbers().get(myIntegerSize - 1) == '-')return 1;else {if (this.length > myInteger.getLength())return 1;else if (this.length < myInteger.getLength())return -1;else {for (int i = this.length - 1; i >= 0; i--) {if (this.numbers.get(i) > myInteger.getNumbers().get(i))return 1;else if (this.numbers.get(i) < myInteger.getNumbers().get(i))return -1;elsecontinue;}}return 0;}}
}

乘法和除法还没有来得及实现。这里的继承写的比较烂,所以在整数和自然数中有一些重复的代码。

java整数类和自然数类的简单实现相关推荐

  1. [ 转载 ] Java基础10--关于Object类下所有方法的简单解析

    关于Object类下所有方法的简单解析 类Object是类层次结构的根类,是每一个类的父类,所有的对象包括数组,String,Integer等包装类,所以了解Object是很有必要的,话不多说,我们直 ...

  2. java 数据对_数据表与简单java类(一对多)

    emp表:empno,ename,job,sal,comm,mgr,deptno dept表:deptno,dname,loc 要求可以通过程序描述出如下对应关系 一个部门有多个部员,并且可以输出一个 ...

  3. java file 实例_Java File类的详解及简单实例

    Java File类的详解及简单实例 1. File():构造函数,一般是依据文件所在的指定位置来创建文件对象. CanWrite():返回文件是否可写. CanRead():返回文件是否可读. Co ...

  4. java 简单的调用类_java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊...

    java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊 java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊 总体分三步走: 一.准备一个 C# 类库 (d ...

  5. java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊...

    java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊 java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊 总体分三步走: 一.准备一个 C# 类库 (d ...

  6. Java之项目用到类Objects,TreeMap排序简单分享

    开心一笑 [记者去采访一山区百岁老农: "老人家,你是吃什么东西才能保持长寿的啊?" 百岁老农: "我们这只能种玉米,平时也是以玉米为主食." 记者: &quo ...

  7. Java基础篇:常用类

    文章目录 1.字符串相关的类 1.1 String类及常用方法 String的特性 String对象的创建 字符串对象是如何存储的 String使用陷阱 String常用方法 1.2 StringBu ...

  8. java中常见的异常类

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  9. java 大数类_Java大数类介绍

    java能处理大数的类有两个高精度大整数BigInteger和高精度浮点数BigDecimal,这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.B ...

  10. java程序设计专业介绍_简介Java编程中的Object类

    这篇文章主要介绍了简介Java编程中的Object类,是Java入门学习中的基础知识,需要的朋友可以参考下 Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每 ...

最新文章

  1. CV之FR(H+k机器学习):基于每人几张人脸图片训练H+k模型实现(国内外明星)新人脸图像的姓名预测(准确度高达100%)
  2. C语言中的nan和inf使用
  3. 各种编码范围总结以及linux下面的编码批量转化
  4. jQuery刻度尺滚动滑块插件
  5. android opengl es 粒子效果实例代码
  6. MPI 环境搭建问题-运行程序闪退
  7. C++ : 自写两个字符串分割函数(含测试程序)
  8. html 打开页面光标自动选中输入框_Python自动部署码云:
  9. php 集群 session共享,Session共享:php和redis集群如何实现Session共享
  10. android handler的机制和原理_Android消息机制的原理及源码解析
  11. C# 5.0 Async函数的提示和技巧
  12. iOS 数组模型排序
  13. 动态规划——Palindrome Partitioning II
  14. python编的俄罗斯方块游戏_Python编写俄罗斯方块小游戏
  15. 计算机技术培训新闻,二附院举办ERAS下人工智能计算机辅助关节置换技术
  16. XP系统经典故障FAQ
  17. 色调,饱和度,亮度如何计算
  18. 微信开发之使用java获取签名signature(贴源码,附工程)
  19. stm32mcuid规则_STM32型号命名规则
  20. 一个牛人给Java初学者的建议(必看篇)

热门文章

  1. 读博太孤独?一个人的苦行!
  2. 区块链是什么意思 如何简单明了的理解区块链
  3. linux终端怎么复制粘贴某一行_如何在Linux终端中复制和粘贴文本、文件和文件夹...
  4. kityminder-editor 百度脑图与my-mind 使用体验
  5. 十大最佳外国Android游戏下载平台
  6. 高仿富途牛牛-组件化-界面美化
  7. 基因变异相关序列提取工具
  8. 欧拉函数的求法(三种)
  9. python 写文件write(string), writelines(list) ,读文件
  10. 静候 CSDN 佳音