1

此代码适用于某些输入。但是对于更高的输入值(例如 1000000),我得到一个 NumberFormatError。输入(用于 s[])的范围为 1-2000000 可能是什么原因?

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */

       try
        {
         BufferedReader read = new BufferedReader(new InputStreamReader(System.in));

         int no=Integer.parseInt(read.readLine());

         String s[]=read.readLine().split(" ");

         int result=0;

         for(int i=0; i<no; i++)
         {
             result+= Integer.parseInt(s[i]);
             if(result<0)
                 result=0;
         }
         System.out.println(result);

        }
        catch(IOException e)
       {
           System.out.println(e.getMessage());
       }
    }
}
4

3 回答 3

3

在你的 for 循环中,你输入的第一个数字是数组的大小。到目前为止,您的逻辑就是这样。除非您实际上是手动加载 2,000,000 个数字(或复制/粘贴),否则这会抛出ArrayIndexOutOfBoundsException.

NumberFormatException如果您要输入非数字作为第二个输入,或者大于Integer.MAX_VALUE(2147483647) 或小于Integer.MIN_VALUE(-2147483648)的数字,您会得到一个。

输入类似:

1000000
2 1 2 1 2 1 /*... 999990 digits later ...*/ 2 1 2 1

使程序正确终止。这是我使用的输入文件,如果有人想要的话: http: //ge.tt/95Lr2Kw/v/0

该程序是从命令提示符手动编译和运行的,如下所示java Solution < in.txt

编辑:我只记得数组中的输入值可能大到 2000000。您必须使用 aBigInteger来保存result大到 2000000^2 的值。

于 2013-10-26T14:04:16.183 回答
0

假设它不是缓冲区溢出,任何传递给的非数字字符Integer.parseInt都会抛出NumberFormatException. 这包括空格和不可打印的字符,如换行符和小数点(因为浮点数不是整数)。

.trim()您可以尝试通过在调用时使用来验证您的输入read.readLine(),以及在传递给之前检查空字符串或空字符串Integer.parseInt()。就像是:

     String input = read.readLine();

     if ( input != null )
         input = input.trim();
     if ( input.equals("") )
         throw new IllegalArgumentException("Input must be a number");

     int no=Integer.parseInt( input );

但是,您决定验证第一行的输入,也对第二个 readLine() 调用进行验证。希望您可以准确缩小导致问题的原因。

于 2013-10-26T14:30:59.180 回答
0

I am agree with @lzmaki. I don't get any NumberFormatException for your value. But, I get ArrayIndexOutofBoundException which actually caused from StackOverFlow when I tried like this:

1000000
1 2 3
then enter

as in that time, the system recognize that it have not enough memory in its stack for hold such huge number of data.

I got NumberFormatException for the following case:

1000000
enter twice

becuase not system get a non-number format to convert integer format which is "".

I hope my analysis help you to find your bug :)

于 2013-10-26T14:23:08.570 回答