【算法】程序猿不写代码是不对的30

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;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值