2012-05-11 3 views
1

Проблема: я не могу сохранить номер «600851475143». Я понимаю, что это число больше, чем то, что может содержать int, и меньше максимального значения. Однако моя программа не регистрирует переменную «число» как длинную, она регистрирует ее как int. Может кто-то пролить свет на эту проблему?Ошибки в Java примитивных типов данных?

** - линия проблемы

public class Problem3{ 
//What is the largest prime factor of the number 600851475143 
public static void main(String[] args){ 
    ***long number = 600851475143 , total = 0; 
    for(long x = (number-1)/2; x>1; x--) 
     if(number%x == 0 && isPrime(x)) total += x; 
    System.out.println(total); 
} 
private static boolean isPrime(long determine){ 
    for(long x = determine/2 - 1; x>1; x--) 
    if(determine%x ==0) return false; 
    return true; 
} 

}

РЕШЕНИЕ: Как сказано ниже Джим, чтобы типа длиной, один должен поставить "L" или "л" в конец номера. «Целочисленный литерал имеет тип long, если он заканчивается буквой L или l, в противном случае он имеет тип int. Рекомендуется использовать букву верхнего регистра L, потому что букву нижнего регистра l трудно отличить от цифры 1.» - С сайта Oracle на примитивных типах.

Чуть подробнее: Java's L number (long) specification

+3

Я вижу 2147483647 в вашем коде, не 600851475143. Не то, что должно привести к 'number' быть ИНТ и не долго. .. – BoltClock

+0

Извините, я пытался решить мою проблему. «2147483647» - это максимальное число, которое может быть сохранено как int. Я понял, что любое число выше этого числа вызывает ошибку. Я редактировал свое оригинальное сообщение, чтобы избежать потенциальной путаницы для людей в будущем. – user1390463

ответ

4

Нанести небольшое 'L' в этом буквенное значение:

600851475143L 

Причина заключается в том:

Целое литерал типа долго, если ему заканчивается буквой L или l; в противном случае это тип int. Рекомендуется использовать верхние буквы L, так как строчная буква л трудно отличить от цифры 1.

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Вы можете использовать эту запись тоже, чтобы быть более ясным:

600_851_475_143L 
+2

Не нужно быть маленьким «l», это может быть большой L тоже. – EJP

+3

Я рекомендую использовать нижний регистр L, так как он часто выглядит как 1 (один). Вместо этого используйте верхний регистр L. – Brigham

+0

Да, иногда трудно отличить l от 1. Спасибо –

4

"my program isn't registering the variable "number" as a long, it is registering it as a int".

Неправильное использование. Вы объявили его длинным. Это долго.

Что вы должны получать, это совсем другое: компилировать ошибку на постоянной 600851475143. Попробуйте 600851475143L. Я предлагаю, чтобы, если вы прочли сообщение об ошибке компилятора, вы бы это заметили.

+0

Спасибо, я сделал дальнейшее исследование после. Мой компилятор только сказал: «Ошибка: целое число слишком велико: 6008514751143». – user1390463

+1

@ user1390463 Точно как я уже сказал. Компилятор рассказал вам, что именно не так. Ваша первая ошибка заключалась в том, чтобы калечить то, что сообщение говорило вам, «не регистрирует переменную« число »как длинное». – EJP

12

Длинные литералы должны быть выражены с помощью символа «L», как и в 600851475143L

+0

Спасибо, Джим. Это очень помогло. – user1390463

Смежные вопросы