package com.kingdz.algorithm.time201703;
import java.util.Arrays;
/**
* 简单的大数加减乘除法<br/>
* 本代码中不考虑小数点,对于特殊需要如计算大数pi时可以假设number[0]和number[1]之间有一个小数点
*
* @author kingdz
*
*/
public class Algo14 {
public static void main(String[] args) {
int[] number = new int[20];
for (int i = 0; i < number.length; i++) {
number[i] = 0;
}
number[1] = 3;
System.out.println(Arrays.toString(number));
number = multip(5, number);
System.out.println(Arrays.toString(number));
number = add(number, number);
number = minus(number, number);
number = multip(number, 1);
number = divi(number, 1);
}
/**
* 除法运算
*
* @param number
* @param div
* @return
*/
public static int[] divi(int[] number, int div) {
int div1 = 0;// 记录被除数
for (int i = 0; i < number.length; i++) {
div1 = div1 + number[i];
if (div1 >= div) {
number[i] = div1 / div;
div1 = div1 % div;
} else {
number[i] = 0;
}
// 除完之后剩余的被除数需要进位
div1 = div1 * 10;
}
return number;
}
/**
* 乘法运算,改进版本,减少for循环的次数
*
* @param mult
* @param number
* @return
*/
public static int[] multip(int mult, int[] number) {
int carry = 0;
for (int i = number.length - 1; i >= 0; i--) {
int result = number[i] * mult + carry;
number[i] = result % 10;
carry = result / 10;
}
return number;
}
/**
* 乘法运算
*
* @deprecated replaced by <code>multip(int mult, int[] number)</code>.
* @param number
* @param mult
* @return
*/
@Deprecated
static int[] multip(int[] number, int mult) {
// 乘法运算
for (int i = 0; i < number.length; i++) {
number[i] = number[i] * mult;
}
// 处理进位
for (int i = number.length - 1; i > 0; i--) {
if (number[i] >= 10) {
int add = number[i] / 10;
number[i] = number[i] % 10;
number[i - 1] = number[i - 1] + add;
}
}
if (number[0] > 10) {
System.out.println("结果溢出");
number[0] = number[0] % 10;
}
return number;
}
/**
* 减法运算
*
* @param min1
* @param min2
* @return
*/
private static int[] minus(int[] min1, int[] min2) {
if (min1.length != min2.length) {
System.out.println("目前仅支持相同位数的大数运算");
return min1;
}
for (int i = min1.length - 1; i > 0; i--) {
if (min1[i] >= min2[i]) {
min1[i] = min1[i] - min2[i];
} else {
min1[i - 1]--;
min1[i] = min1[i] + 10 - min2[i];
}
}
if (min1[0] < 0) {
System.out.println("结果为负数,错误");
}
return min1;
}
/**
* 加法运算
*
* @param add1
* @param add2
* @return
*/
public static int[] add(int[] add1, int[] add2) {
if (add1.length != add2.length) {
System.out.println("目前仅支持相同位数的大数运算");
return add1;
}
// 进行加法运算
for (int i = 0; i < add1.length; i++) {
add1[i] = add1[i] + add2[i];
}
// 实现进位
for (int i = add1.length - 1; i > 0; i--) {
if (add1[i] >= 10) {
int add = add1[i] / 10;
add1[i] = add1[i] % 10;
add1[i - 1] = add1[i - 1] + add;
}
}
// 判断溢出
if (add1[0] >= 10) {
System.out.println("结果溢出");
add1[0] = add1[0] - 10;
}
return add1;
}
}
【算法】程序猿不写代码是不对的30
最新推荐文章于 2023-12-24 16:00:47 发布