西电实验:Java实现大整数类(重写、完善)
2021/5/10 22:28:58
本文主要是介绍西电实验:Java实现大整数类(重写、完善),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
西电实验:Java实现大整数类(重写、完善)
关于实验内容
https://blog.csdn.net/qq_44274276/article/details/105079948
重写大整数类
自然数类和大整数类其实没啥本质区别,就是自然数是非负的,不需要考虑符号而已!所以我就不重写自然数了,就写大整数吧!
MyInteger.java程序
package number; import java.util.Scanner; /** * @author jiangzl */ public class MyInteger { private static final int DEFAULT_SIZE = 32; public static final MyInteger MAX_VALUE = new MyInteger("9999999999999999999999999999999999"); public static final MyInteger MIN_VALUE = new MyInteger("-99999999999999999999999999999999999"); private static final MyInteger zero = new MyInteger(0); private static final MyInteger one = new MyInteger(1); private int[] number; private int size; private int capacity = DEFAULT_SIZE; private String value; private boolean isNotNegative; private boolean isNumber() { int len = value.length(); boolean flag = true; for (int i = 0; i < len; ++i) { if (value.charAt(i) < '0' || value.charAt(i) > '9') { if (',' == value.charAt(i) && 0 == (len - i + 1) % 3) { continue; } if ('-' == value.charAt(i) && 0 == i) { continue; } flag = false; } } return flag; } public MyInteger() { value = "0"; size = 1; isNotNegative = true; number = new int[capacity]; } public MyInteger(int i) { String builder = Integer.toString(i); size = builder.length(); number = new int[size]; StringBuilder valueBuilder = new StringBuilder(); isNotNegative = (i >= 0); if (!isNotNegative) { valueBuilder.append('-'); } int l = (isNotNegative ? 0 : 1); for (; l < size; ++l) { number[l] = builder.charAt(l) - '0'; valueBuilder.append(number[l]); } value = valueBuilder.toString(); } public MyInteger(int[] num) { size = num.length; number = new int[capacity]; isNotNegative = true; System.arraycopy(num, 0, number, 0, size); StringBuilder valueBuilder = new StringBuilder(); for (int i = 0; i < size; ++i) { valueBuilder.append(number[i]); } value = valueBuilder.toString(); } public MyInteger(String s) { size = s.length(); number = new int[size]; isNotNegative = (s.charAt(0) != '-'); int i = (isNotNegative ? 0 : 1); for (; i < size; ++i) { number[i] = s.charAt(i) - '0'; } value = s; } public static MyInteger getMyIntegerWithThousands(String s) { StringBuilder builder = new StringBuilder(); MyInteger ret = new MyInteger(); int len = s.length(); if ('-' == s.charAt(0)) { ret.isNotNegative = false; } for (int i = 0; i < len; ++i) { if (',' != s.charAt(i)) { builder.append(s.charAt(i)); } } ret.value = builder.toString(); return ret; } public MyInteger(final MyInteger integer) { capacity = integer.capacity; size = integer.size; number = new int[size]; isNotNegative = integer.isNotNegative; System.arraycopy(integer.number, 0, number, 0, size); value = integer.value; } public void scanInteger() { Scanner scanner = new Scanner(System.in); value = scanner.next(); if (isNumber()) { isNotNegative = (value.charAt(0) != '-'); size = value.length(); number = new int[size]; int i = (isNotNegative ? 0 : 1); for (; i < size; ++i) { number[i] = value.charAt(i) - '0'; } } else { value = "0"; isNotNegative = true; size = 1; number = new int[capacity]; } } private boolean isAbsLessThan(final MyInteger integer) { int size1 = size, size2 = integer.size; if (!isNotNegative) { size1--; } if (!integer.isNotNegative) { size2--; } if (size1 < size2) { return true; } else if (size1 > size2) { return false; } int len = size; for (int i = 0; i < len; ++i) { if (number[i] < integer.number[i]) { return true; } else if (number[i] > integer.number[i]) { return false; } } return false; } private boolean isLessThan(final MyInteger integer) { if (!(isNotNegative && integer.isNotNegative)) { if (!isNotNegative) { return true; } else { return false; } } return isAbsLessThan(integer); } public boolean equals(final MyInteger integer) { return (!isLessThan(integer) && !integer.isLessThan(this)); } private MyInteger addAbs(final MyInteger integer) { MyInteger ret = new MyInteger(integer); int len = Math.max(size, integer.size); int[] t1 = new int[len + 1]; int[] t2 = new int[len + 1]; int[] ad = new int[len + 1]; for (int i = 0; i < size; ++i) { t1[i] = number[size - i - 1]; } for (int i = 0; i < integer.size; ++i) { t2[i] = integer.number[integer.size - i - 1]; } for (int i = 0; i < len; ++i) { ad[i] = t1[i] + t2[i]; } for (int i = 0; i < len; ++i) { if (ad[i] >= 10) { ad[i + 1] += ad[i] / 10; ad[i] %= 10; } } while (0 == ad[len] && len > 0) { len--; } ret.size = len + 1; ret.number = new int[ret.size]; StringBuilder addBuilder = new StringBuilder(); for (int i = 0; i < ret.size; ++i) { ret.number[i] = ad[ret.size - i - 1]; addBuilder.append(ret.number[i]); } ret.value = addBuilder.toString(); return ret; } private MyInteger subAbs(final MyInteger integer) { MyInteger ret = new MyInteger(); int len = Math.max(size, integer.size); int[] i1 = new int[len + 1]; int[] i2 = new int[len + 1]; int[] su = new int[len + 1]; for (int i = 0; i < size; ++i) { i1[i] = number[size - i - 1]; } for (int i = 0; i < integer.size; ++i) { i2[i] = integer.number[integer.size - i - 1]; } for (int i = 0; i < len; ++i) { su[i] = i1[i] - i2[i]; } for (int i = 0; i < len; ++i) { if (su[i] < 0) { su[i + 1]--; su[i] += 10; } } while (0 == su[len] && len > 0) { len--; } ret.size = len + 1; ret.number = new int[ret.size]; StringBuilder subBuilder = new StringBuilder(); for (int i = 0; i < ret.size; ++i) { ret.number[i] = su[ret.size - i - 1]; subBuilder.append(ret.number[i]); } ret.value = subBuilder.toString(); return ret; } private MyInteger mulAbs(final MyInteger integer) { MyInteger ret = new MyInteger(integer); int len = size + integer.size; int[] i1 = new int[size + 1]; int[] i2 = new int[integer.size + 1]; int[] mu = new int[len + 1]; for (int i = 0; i < size; ++i) { i1[i] = number[size - i - 1]; } for (int i = 0; i < integer.size; ++i) { i2[i] = integer.number[integer.size - i - 1]; } for (int i = 0; i < size; ++i) { for (int j = 0; j < integer.size; ++j) { mu[i + j] += i1[i] * i2[j]; } } for (int i = 0; i < len; ++i) { if (mu[i] >= 10) { mu[i + 1] += mu[i] / 10; mu[i] %= 10; } } while (0 == mu[len] && len > 0) { len--; } ret.size = len + 1; ret.number = new int[ret.size]; StringBuilder mulBuilder = new StringBuilder(); for (int i = 0; i < ret.size; ++i) { ret.number[i] = mu[ret.size - i - 1]; mulBuilder.append(ret.number[i]); } ret.value = mulBuilder.toString(); return ret; } private MyInteger divAbs(final MyInteger integer) throws Exception { MyInteger ret = new MyInteger(); if ((new MyInteger(0).equals(integer))) { throw new Exception("Exception: The divisor can not be zero!"); } if (isAbsLessThan(integer)) { return new MyInteger(0); } MyInteger divInt = new MyInteger(this); while (!divInt.isAbsLessThan(integer)) { ret = ret.addAbs(one); divInt = divInt.subAbs(integer); } return ret; } private MyInteger modAbs(final MyInteger integer) throws Exception { MyInteger ret = new MyInteger(); if ((new MyInteger(0).equals(integer))) { throw new Exception("Exception: The divisor can not be zero!"); } if (!isNotNegative || !integer.isNotNegative) { throw new Exception("Exception: The modulus cannot be negative!"); } ret = this.subAbs(integer.mulAbs(this.divAbs(integer))); return ret; } public MyInteger add(final MyInteger integer) { MyInteger ret = new MyInteger(integer); if (isNotNegative && integer.isNotNegative) { ret.isNotNegative = true; ret = addAbs(integer); } else if (!isNotNegative && !integer.isNotNegative) { ret.isNotNegative = false; ret = addAbs(integer); } else { if (isAbsLessThan(integer)) { ret = integer.subAbs(this); ret.isNotNegative = !isNotNegative; } else { ret = subAbs(integer); ret.isNotNegative = isNotNegative; } } if (!ret.isNotNegative) { ret.value = "-" + ret.value; } return ret; } public MyInteger sub(final MyInteger integer) { MyInteger ret = new MyInteger(integer); if (isNotNegative == integer.isNotNegative) { if (isAbsLessThan(integer)) { ret = integer.subAbs(this); ret.isNotNegative = integer.isNotNegative; } else { ret = subAbs(integer); ret.isNotNegative = isNotNegative; } } else { ret = addAbs(integer); ret.isNotNegative = isNotNegative; } if (!ret.isNotNegative) { ret.value = "-" + ret.value; } return ret; } public MyInteger mul(final MyInteger integer) { MyInteger ret = mulAbs(integer); ret.isNotNegative = (isNotNegative == integer.isNotNegative); if (!ret.isNotNegative) { ret.value = "-" + ret.value; } return ret; } public MyInteger div(final MyInteger integer) throws Exception { MyInteger ret = divAbs(integer); ret.isNotNegative = (isNotNegative == integer.isNotNegative); if (!ret.isNotNegative) { ret.value = "-" + ret.value; } return ret; } public MyInteger mod(final MyInteger integer) throws Exception { return modAbs(integer); } @Override public String toString() { return value; } }
Main测试程序
package test; import number.MyInteger; import java.util.Scanner; /** * @author jiangzl */ public class MainOfInteger { public static void main(String[] args) throws Exception { MyInteger integer = new MyInteger(); System.out.println(integer); integer = new MyInteger(-35535); System.out.println(integer); // integer=-35535 int[] num = {1, 2, 3, 4, 5}; integer = new MyInteger(num); System.out.println(integer); // integer=12345 MyInteger newInt = new MyInteger(); System.out.println(newInt); // newInt=0 newInt = integer; System.out.println(newInt); MyInteger integer1 = new MyInteger("-123"); // integer1=-123 System.out.println(integer1); MyInteger scanInt = new MyInteger(); scanInt.scanInteger(); System.out.println(scanInt); MyInteger addRes = integer.add(integer1); System.out.println(addRes); // add : -123+12345=12222 MyInteger subRes = integer.sub(integer1); System.out.println(subRes); // sub : 12345-(-123)=12468 MyInteger mulRes = integer.mul(integer1); System.out.println(mulRes); // mul : -123*12345=-1518435 MyInteger divRes = integer.div(integer1); System.out.println(divRes); // 12345/-123=-100 MyInteger i = new MyInteger(123); MyInteger modRes = integer.mod(i); System.out.println(modRes); // 12345 % -123 MyInteger i2 = MyInteger.getMyIntegerWithThousands("-1,000,000"); System.out.println(i2); } }
结束
这次的代码写的就比以前写的完善很多了,也花了一下午的时间,希望大家多提出意见~
这篇关于西电实验:Java实现大整数类(重写、完善)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南