定义一个函数,在该函数中可以实现任意两个整数的加法。java实现

时间:2022-07-23
本文章向大家介绍定义一个函数,在该函数中可以实现任意两个整数的加法。java实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

这道题实际上是一道面试题的拓展,原题是要求打印1到最大的n位数。原题是这样描述的:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1,2,3,4,5一直到最大的三位数999。拿到这道题之后,对于没有大数经验的面试者估计立马就想到了一种简单的解法。首先求出这个最大的n位数,然后来一个for循环从1开始逐个打印。假如这么想那就掉入面试官的陷阱中去了。实际上这道题远没有这么简单,必须从大数的角度来解答。对于计算机而言,它的任意一个数据类型都是有范围的。如果我们输入的数据大于计算机所能表示的范围,那么计算机必然会报错。所以这个时候需要使用另外一种方法来表示这些大数。至于这道题是怎么解决的,自行百度,网上有很多资源。

上面都是抛砖引玉,现在正式讲解这道题拓展题的解法。

题目:定义一个函数,在该函数中可以实现任意两个整数的加法。

对于这道题,由于没有限定输入的两个数的范围,我们要按照大数问题来处理。由于题目是要求实现任意两个整数的加法,我们就要考虑如何实现大数的加法。此外这两个整数是任意的,所以也有可能存在负数。通常对于大数问题,常用的方法就是使用字符串来表示这个大数。我们可以首先将两个整数分别用字符串来表示,然后分别将这两个字符串拆分成对应的字符数组。当两个整数都是正数的时候直接相加结果为正数,同为负数的时候取两者的绝对值相加然后在结果前加一个负号。假若是一正一负,则用两者的绝对值相减,用绝对值大的数减去绝对值小的数,当正数的绝对值大的时候相减的结果为正数,当负数的绝对值大的时候相减的结果为负数,结果为负数时在相减的结果前加一个负号即可。在具体进行相加的时候两个字符数组对应的数字字符相加即可,当有进位的时候做出标记,在更高一位进行相加时再将这个进位加进去。同样在相减的时候有借位的也做出标记,在更高一位相减的时候将这个借位算进去。下面是使用java实现的代码:

package com.michael.programming;

public class Interview12_page94extends {
	public static void main(String args[]) {
		String num1="-1004215696420130001";
		String num2="123";
		char num[] = add(num1, num2);
		printNumber(num);
	}

	public static char[] add(String str1, String str2) {
		char[] num1=str1.toCharArray();//调用函数将字符串转换成字符数组
		char[] num2=str2.toCharArray();
		int nsum = 0;
		int nTakeOver = 0;
		boolean flag = false;
		char[] num = null;
		// 两个大数做加法运算有两种情况1. 一正一负 2.同时为正或同时为负数
		// 对于第一种情况取绝对值做减法运算,如果负数的绝对值更大则结果是负数,否则结果为正数
		// 对于第二种情况 直接做加法运算 同为正数 结果则为正数 否则结果为负数
		// 第一种情况
		if ((num1[0] == '-' && num2[0] != '-')
				|| (num1[0] != '-' && num2[0] == '-')) {
			if (num1[0] == '-' && num2[0] != '-') {
				num1 = absNum(num1);
				num2 = absNum(num2);
				if (getMaxAbs(num2, num1)) {
					// num2大结果为正数
					char temp[] = num1;
					num1 = num2;
					num2 = temp;
				} else {
					flag = true;// num1大结果为负数
				}
			} else {
				num1 = absNum(num1);
				num2 = absNum(num2);
				if (getMaxAbs(num2, num1)) {
					flag = true;// 结果为负数
					char temp[] = num1;
					num1 = num2;
					num2 = temp;
				}
				// 否则num1大 结果为正数
			}
			num = new char[num1.length];
			for (int i = num1.length - 1, j = num2.length - 1; i >= 0; i--, j--) {
				if (j >= 0) {
					nsum = num1[i] - num2[j] + nTakeOver;
					if (nsum < 0) {
						// 相减结果小于0 向上借一位
						nTakeOver = -1;
						nsum = nsum + 10;
						num[i] = (char) (nsum + '0');
					} else {
						nTakeOver = 0;
						num[i] = (char) (nsum + '0');
					}
				} else {
					nsum = num1[i] + nTakeOver - '0';
					if (nsum < 0) {
						nTakeOver = -1;
						nsum = nsum + 10;
						num[i] = (char) (nsum + '0');
					} else {
						nTakeOver = 0;
						num[i] = (char) (nsum + '0');
					}
				}
			}
		} else {//第二种情况
			if (num1[0] == '-' && num2[0] == '-') {
				num1 = absNum(num1);
				num2 = absNum(num2);
				flag = true;
			}
			if (getMaxAbs(num2, num1)) {
				char[] temp = num1;
				num1 = num2;
				num2 = temp;
			}
			num = new char[num1.length];
			for (int i = num1.length - 1, j = num2.length - 1; i >= 0; i--, j--) {
				if (j >= 0) {
					nsum = num1[i] - '0' + num2[j] - '0' + nTakeOver;
					if (nsum >= 10) {
						// 相加大于等于十 产生进位
						nTakeOver = 1;
						nsum = nsum - 10;
						num[i] = (char) (nsum + '0');
					} else {
						nTakeOver = 0;
						num[i] = (char) (nsum + '0');
					}
				} else {
					nsum = num1[i] - '0' + nTakeOver;
					if (nsum >= 10) {
						nTakeOver = 1;
						nsum = nsum - 10;
						num[i] = (char) (nsum + '0');
					} else {
						nTakeOver = 0;
						num[i] = (char) (nsum + '0');
					}
				}

			}
		}
		if (flag) {
			char temp[] = new char[num.length + 1];
			temp[0] = '-';
			for (int i = 0; i < num.length; i++) {
				temp[i + 1] = num[i];
			}
			return temp;
		} else {
			return num;
		}
	}

	// 获得一个数的绝对值
	public static char[] absNum(char[] num) {
		if (num[0] != '-')
			return num;
		char temp[] = new char[num.length - 1];
		for (int i = 1; i < num.length; i++) {
			temp[i - 1] = num[i];
		}
		return temp;
	}

	// 判断两个数的绝对值的大小
	public static boolean getMaxAbs(char[] num1, char[] num2) {
		num1 = absNum(num1);
		num2 = absNum(num2);
		int length1 = num1.length;
		int length2 = num2.length;
		if (length1 > length2)
			return true;
		if (length1 < length2)
			return false;
		for (int i = 0; i < length1; i++) {
			if (num1[i] > num2[i])
				return true;
			if (num1[i] < num2[i])
				return false;
		}
		return true;
	}

	//打印结果
	public static void printNumber(char number[]){
		boolean IsBeginWith0=true;
		//如果第一个字符为'-'则先打印出该字符 然后i从1开始遍历该字符数组 从第一个非0字符开始打印该字符数组
		int i=0;
		if(number[0]=='-') 
		{
			System.out.print(number[0]);
			i=1;
		}
		for(;i<number.length;i++){
			if(IsBeginWith0&&number[i]!='0'){
				break;
			}
		}
		for(;i<number.length;i++){
			System.out.print(number[i]);
		}
		System.out.print("t");
	}
}