2015-04-08 2 views
-1

Моя домашнее задание Проектировать класс с именем MyInteger со следующими условиями:Дизайн класс, который говорит, является ли число простым или не

  • поле ИНТ данных с именем значение, которое хранит Int значение целого числа ,

  • Конструктор, который создает объект MyInteger для указанного значения int.

  • Метод get, возвращающий значение int.

  • Метод isPrime(), который возвращает true, если значение является простым числом. См. Раздел 4.10 текста для Java-кода, который обнаруживает простые числа (это может различаться в зависимости от имеющейся у вас версии). \

  • Статический isPrime (MyInteger), который возвращает true, если это значение является простым числом. Обратите внимание, что этот метод принимает в качестве параметра ссылочную переменную объекта (а не значение).

Мои проблемы возникают в статическом методе булевой IsPrime, заявив, что «/» и «%» не определено для типа arguement и основной метод в моем случае утверждение: IsPrime() == верно. Он говорит, чтобы изменить его на static, но у меня уже есть статический логический метод isPrime, и я должен иметь два метода isPrime в соответствии с моими условиями. Спасибо, если вы в состоянии помочь.

public class MyInteger { 


    public MyInteger(int value){ 

    } 
    public static int getValue(){ 
     int value = 997; 
     return value; 
    } 
    public boolean isPrime(){ 
     int value = 997; 
     for (int i=2; i<=value/2; i++){ 
      if(value % i == 0) { 
       return false; 
       } 
     } 
     return true; 
    } 
    public static boolean isPrime(MyInteger value){ 
     for(int i=2; i<=value/2; i++){ 
      if(value%i == 0){ 
       return false; 
      } 
     } 
     return true; 
    } 

    public static void main(String[] args) { 
      MyInteger value = new MyInteger(MyInteger.getValue()); 
      if (isPrime()==true && isPrime(value)==true){ 
       System.out.println("Testiwng Instance method, is Prime"); 
       System.out.println("isPrime: " + value + " is prime"); 
       System.out.println("--------------------------------"); 
       System.out.println("Testing Class method (That takes a reference variable) is Prime"); 
       System.out.println("isPrime: " + value + " is prime"); 
      } 
      else{ 
       System.out.println("Testiwng Instance method, is Prime"); 
       System.out.println("isPrime: " + value + " is not prime"); 
       System.out.println("--------------------------------"); 
       System.out.println("Testing Class method (That takes a reference variable) is Prime"); 
       System.out.println("isPrime: " + value + " is not prime"); 
      } 

     } 
} 
+1

Какой вызов 'isPrime()' в 'main()' вызван? 'static' методы не имеют экземпляра ... – Arkadiy

+0

Если ваш номер не делится на 2, вам нужно проверить, делится ли он на 4?Потенциальная оптимизация заключается в том, чтобы использовать сито Eratosthenes для вычисления простых чисел меньше квадрата (значение), а затем проверки остатков преформы против этого списка. – Andreas

ответ

2

Вам не нужно идти до половины номера, чтобы проверить, является ли оно простым. Вы можете иметь цикл, который проверяет только числа от 2 до квадратного корня вашего номера. Смотрите это - StackOverflow question about checking prime numbers

Я считаю, что вам нужно что-то вроде этого:

public class Main { 
    public static void main(String[] args) throws IOException { 
     Scanner inp = new Scanner(System.in); 
     int someValue = inp.nextInt(); 
     MyInteger myInt = new MyInteger(someValue); 
     System.out.println("Testing instance method:"); 
     System.out.println(myInt.isPrime()); 
     System.out.println("Testing static method:"); 
     System.out.println(MyInteger.isPrime(myInt)); 
    } 
} 

class MyInteger { 
    private int value; 

    public MyInteger(int value) { 
     this.value = value; 
    } 
    public int getValue() { 
     return value; 
    } 
    public boolean isPrime() { 
     int sqrt = (int) Math.sqrt((double)value); 
     for(int i = 2; i <= sqrt; i++) { 
      if (value % i == 0) return false; 
     } 
     return true; 
    } 

    public static boolean isPrime(MyInteger myInt) { 
     return myInt.isPrime(); 
    } 
} 
1

Ваше значение переменной в методе вы упомянули имеет тип MyInteger, но вы пытаетесь использовать его в качестве междунар. вы, вероятно, захотите использовать value.getValue().

1

Вы должны рассмотреть с помощью переменного уровня класса, чтобы использовать конструктор для инициализации его. Также в методе main() вы пытаетесь получить доступ к нестационарному методу (isPrime()), используйте его как value.isPrime().

В случае, если вы не хотите использовать переменный класс, использовать метод статического ПолучитьЗначения() внутри метода статического булева IsPrime (значение MyInteger), который решает проблему

1

Вот хорошая ссылка для проверки простых чисел What would be the fastest method to test for primality in Java?

в первую очередь, изменить IsPrime() для

boolean isPrime(long n) { 
    if(n < 2) return false; 
    if(n == 2 || n == 3) return true; 
    if(n%2 == 0 || n%3 == 0) return false; 
    long sqrtN = (long)Math.sqrt(n)+1; 
    for(long i = 6L; i <= sqrtN; i += 6) { 
     if(n%(i-1) == 0 || n%(i+1) == 0) return false; 
    } 
    return true; 
} 
0

другой способ проверить простое число

public String isPrime(int number) { 
    if (number < 0) { 
     return "not a valid number"; 
    } 
    if (number == 0 || number == 1) { 
     return "not a prime number"; 
    } 
    if (number == 2 || number == 3) { 
     return "prime number"; 
    } 
    if ((number * number - 1) % 24 == 0) { 
     return "prime number"; 
    } else { 
     return "not a prime number"; 
    } 
} 
Смежные вопросы