public static int[] add(int[] number1, int[] number2) {
		int num1Len = number1.length;
		int num2Len = number2.length;
		
		int[] result = (num1Len>num2Len)?new int[num1Len+1]:new int[num2Len+1];
		int carry = 0;
		int i=1;
		for(;i<=num1Len&&i<=num2Len;i++) {
			int currIdx1 = num1Len-i;
			int currIdx2 = num2Len-i;
			int currIdxResult = result.length-i;
			
			if(number1[currIdx1] + number2[currIdx2] + carry<maxSingleInt) {
				result[currIdxResult] = number1[currIdx1] + number2[currIdx2] + carry;
				carry = 0;
			} else {
				int tmp = number1[currIdx1] + number2[currIdx2] + carry;
				result[currIdxResult] = tmp % maxSingleInt;
				carry = tmp / maxSingleInt;
			}
		}
		
		while(i<=num1Len) {
			int currIdx1 = num1Len-i;
			int currIdxResult = result.length-i;
			
			if(number1[currIdx1] + carry<maxSingleInt) {
				result[currIdxResult] = number1[currIdx1] + carry;
				carry = 0;
			} else {
				int tmp = number1[currIdx1] + carry;
				result[currIdxResult] = tmp % maxSingleInt;
				carry = tmp / maxSingleInt;
			}
			i++;
		}
		
		while(i<=num2Len) {
			int currIdx2 = num2Len-i;
			int currIdxResult = result.length-i;
			
			if(number2[currIdx2] + carry<maxSingleInt) {
				result[currIdxResult] = number2[currIdx2] + carry;
				carry = 0;
			} else {
				int tmp = number2[currIdx2] + carry;
				result[currIdxResult] = tmp % maxSingleInt;
				carry = tmp / maxSingleInt;
			}
			i++;
		}
		
		if(carry!=0) {
			result[result.length-i] = carry;
			i++;
		}
		return Arrays.copyOfRange(result, result.length-i+1, result.length);
	}