Проверка, может ли значение int [] быть длинным - PullRequest
1 голос
/ 21 января 2010

У меня есть массив целых, т.е. [1,2,3,4,5]. Каждая строка соответствует десятичному значению, поэтому 5 - 1, 4 - 10, 3 - 100, что дает значение 12345, которое я вычисляю и сохраняю как долго. Это функция:

public long valueOf(int[]x) {

    int multiplier = 1;
    value = 0;
    for (int i=x.length-1; i >=0; i--) {
        value += x[i]*multiplier;
        multiplier *= 10;
    }
    return value;
}

Теперь я хотел бы проверить, не превышает ли значение other int [] задолго до того, как я вычислю его значение с помощью valueOf (). Как это проверить? Должен ли я использовать table.length или, возможно, преобразовать его в String и отправить в

public Long (String s)?

Или, может быть, просто добавить исключение для добавления в функцию valueOf ()?

Ответы [ 3 ]

4 голосов
/ 21 января 2010

Надеюсь, вы знаете, что это ужасный способ хранения больших целых чисел: просто используйте BigInteger .

Но если вы действительно хотите проверить превышение некоторого значения, просто убедитесь, чтодлина массива меньше или равна 19. Тогда вы можете сравнить каждую ячейку отдельно со значением в Long.MAX_VALUE.Или вы можете просто использовать BigInteger.

1 голос
/ 21 января 2010

Краткий ответ: все длинные вписываются в 18 цифр. Так что, если вы знаете, что нет ведущих нулей, просто проверьте x.length

Недостатком является то, что некоторые 19-значные числа являются действительными long, а именно те, которые меньше, чем, я полагаю, доходит, 9223372036854775807. Поэтому, если вы хотите быть по-настоящему точным, вы должны сказать, что длина> 19 плохо, длина <19 - это хорошо, длина == 19, вам нужно проверять цифру за цифрой. В зависимости от того, что вы делаете, отклонение подмножества чисел, которые действительно будут работать, может быть приемлемым. </p>

Как и предполагали другие, главный вопрос: зачем ты это делаешь? Если это какое-то преобразование данных, когда вы получаете числа в виде цепочки цифр из какого-то внешнего источника, и вам нужно преобразовать это в длинный, крутой. Если вы пытаетесь создать класс для обработки чисел, больших, чем поместится в long, то, что вы делаете, является неэффективным и ненужным. Неэффективно, потому что вы можете упаковать в int намного больше одной десятичной цифры, и это даст все виды улучшения памяти и производительности. Нет необходимости, потому что BigInteger уже делает это. Почему бы просто не использовать BigInteger?

Конечно, если это домашнее задание, это другая история.

0 голосов
/ 21 января 2010

Гарантируется ли, что каждое значение x будет неотрицательным?

Если это так, вы можете сделать это:

public long valueOf(int[]x) {

    int multiplier = 1;
    long value = 0;  // Note that you need the type here, which you did not have
    for (int i=x.length-1; i >=0; i--) {
        next_val = x[i]*multiplier;
        if (Long.MAX_LONG - next_val < value) {
          // Error-handling code here, however you 
          // want to handle this case.
        } else {
          value += next_val
        }
        multiplier *= 10;  
    }
    return value;
}

Конечно, BigInteger сделает это намного проще. Но я не знаю, какие у тебя проблемы.

...