2014-11-02 40 views
-2

我正在研究这个项目,想知道是否有人可以帮助我。截至目前,我的程序工作在两个相同的数字整数,但当涉及到两个不同的数字时,我的程序变得疯狂。看看我的代码:试图添加巨大的数字

这几乎是这个项目的最后一部分,我会完成。我还没有学会[arr1> arr2? blah:blah]呢。所以请不要提出这样的建议。我想:

input: 500 
input2: 50 
output: 550 

input: 50 
input2: 500 
output: 550 

的Test1:

input: 500 
input2: 50 
output: 100 

我感谢你的帮助。

+8

“我的程序发疯了” - 不,它没有。它根据您提供的说明进行完全合乎逻辑的事情。因为它是*程序*。如果你需要帮助,你需要告诉我们它正在做什么,确切地说。即你得到的是什么,而不是你想要的输出? – drewmoore 2014-11-02 23:07:43

+1

这看起来很复杂。为什么不将数组转换为整数,然后添加它们? – Michael 2014-11-02 23:08:35

+0

re:“为什么不将数组转换为整数”。这是一个相当不错的股票作业问题。输入可以是一个长度,所以你不能认为这些数字会适合一个int(或者一个长的偶数,大多数的职业将会有一个特定的测试用例)。如果是家庭作业,只要使用BigInteger类,虽然它会打败这一点。 – 2014-11-02 23:14:31

回答

0

最初的问题在我花时间编写代码并创建我自己的reverse,char2Integerpad函数时丢失了。但如果我记得它是在你的循环中,你试图删除领先的空白。无论如何,这是我到目前为止,这似乎很好地工作:

public static void main(String[] args) 
{ 
    Scanner sc = new Scanner(System.in); 
    System.out.print("Input int1: "); 
    char[] firstInteger = sc.nextLine().toCharArray(); 
    System.out.print("Input int2: "); 
    char[] secondInteger = sc.nextLine().toCharArray(); 

    int[] num1 = char2Integer(firstInteger); 
    int[] num2 = char2Integer(secondInteger); 

    sum2(reverse(num1), reverse(num2)); //different length, assumed num1 is bigger 
} 

public static void sum2(int[] num1, int[] num2) 
{ 
    //int over = num1.length-num2.length; 
    int[] sum = new int[num1.length+1]; 
    //The pad function pads the array with 0 so there are no out of range exceptions 
    num1 = pad(num1, sum.length); 
    num2 = pad(num2, sum.length); 

    for (int i = 0; i < num1.length; i++) 
    { 
     sum[i] = sum[i] + num1[i] + num2[i]; 

     //if an element exceeds a value of 10 
     if (sum[i] >= 10) 
     { 
      sum[i] = sum[i]%10; 
      sum[i+1]++; 
     } 
    } 
    sum = reverse(sum); 
    for (int i = 0; i < sum.length; i++) 
     System.out.print(sum[i]); 
} 

而这里是我为你写的垫功能。

public static int[] pad(int[] toPad, int length) 
{ 
    int[] returnArray = new int[length]; 
    int i; 
    for (i = 0; i < toPad.length; i++) 
     returnArray[i] = toPad[i]; 
    for (int j = i; j < returnArray.length; j++) 
     returnArray[j] = 0; 
    return returnArray; 
} 

它不会删除前导零,我会把它留给你。我现在做不了所有的工作,我可以吗?

+0

正是我想要的。完善!你是我的救星。谢谢。 – 2014-11-03 00:34:01

0

Editted的相关性
我将解释什么错误,你需要调整你的算法颇有几分得到它正常工作。

你已经结束了= 1.你检查j结束,这意味着你的循环将只运行一次(在这种情况下)。总和开始为3位数字,然后您设置sum[0] = 0 + 0。总和现在是[0,0,0]。然后在下一个for循环中,检查是否sum[2] == 0,如果它是增加sum [0] 1,不知道为什么。我想你实际上想继续检查零,直到第一个数字已经打印完毕,然后继续打印包括零的所有数字。

0

简单,但可以说是便宜的解决方案,使数量是相同的长度。 (这里的示例代码假设为非负数)。

首先看其是较长的一个,和交换以便NUM1总是较长(如果它们不相等长度:

if(num2.length > num1.length) { 
    //this is only true if num2 is longer than num1. We just swap them using a temp 
    int[] temp; 
    int[] temp = num1; 
    num1 = num2; 
    num2 = num1; 
} 

使最大数量的长度的新阵列(num_temp) ,然后较短的垫用零拷贝到它,然后(结束语这一切的,如果(num1.length!= num2.length)将是触摸清洁剂)。

int[] num_temp = new int[num1.length]; 
for(int i=0; i < num_temp.length; i++) { 
    if(i < num2.length) { 
     // if we are still within the actual number 
     num_temp[i] = num2[i]; 
    } else { 
     // we're beyond the actual number at this point, just pad with 0's 
     num_temp[i] = 0;  
    } 
} 
num2 = num_temp; //swap padded number in place. 

好了,现在你有两个数字,num1和num2长度相同(如果需要,num2在前面用0填充)不知道它们是否完全修复你的代码,但它基本上消除了数字长度与问题不同的情况。