2014-09-09 2 views
-2

Я новичок в Java, у меня есть проблемы, обертывающие мою голову вокруг лаборатории, которую мы недавно назначили. Я надеялся, что кто-то там может помочь мне понять, с чего начать, с проблемой и некоторыми советами, чтобы пройти через нее. ПРИМЕЧАНИЕ. Я НЕ ПРОСИМ, ЧТОБЫ КТО-ТО, ЧТОБЫ НАПИСАТЬ КОД ДЛЯ МЕНЯ. Мне просто нужно небольшое объяснение. Проблема заключается в следующем:Start Off Point - программа Java Safecracker

«Предмет заперт в сейфе Klein за картиной в библиотеке второго этажа. Сейфы Клейна крайне редки, большинство из них вместе с Клейном и его фабрикой были уничтожены в Вторая мировая война. К счастью, старый Брамбо из исследований знал секреты Клейна и записал их до того, как он умер.

Сейф Klein имеет две отличительные особенности: комбинационный замок, который использует буквы вместо цифр, и выгравированную цитату на дверь. В цитате Klein всегда содержится от пяти до двенадцати отдельных заглавных букв, обычно в начале предложений, и упоминается одно или несколько номеров. Пять из прописных букв образуют комбинацию, открывающую сейф. Объединив цифры из всех e номера соответствующим образом вы получаете числовую цель. (Детали построения целевого числа классифицируют.)

Чтобы найти комбинацию вы должны выбрать пять букв v, w, x, y и z, которые удовлетворяют следующему уравнению, где каждая буква заменяется его порядковым положением в алфавите (A=1, B=2, ..., Z=26). Комбинация тогда vwxyz. Если есть больше чем одно решение, то сочетание является тот, который является лексикографически наибольшим, то есть тот, который будет отображаться последним в словаре. «

v - w2 + x3 - y4 + z5 = target 

» Например, если цель 1 и письмо установить ABCDEFGHIJKL, одним возможным решением является FIECB, т.к. 6 - 92 + 53 - 34 + 25 = 1. В этом случае на самом деле существует несколько решений, и комбинация получается LKEBA.

Klein считал, что можно безопасно кодировать комбинацию в гравюре, потому что это может занять много усилий, чтобы попробовать все возможности, даже если вы знали секрет. Но, конечно, компьютеров тогда не существовало ».

=== Директива Op tech ===
« Разработка Java-программы для поиска комбинаций Клейна при подготовке к развертыванию в полевых условиях. Используйте стандартную методологию тестирования в соответствии с ведомственными правилами. Ввод состоит из одной или нескольких строк, содержащих положительную целую цель менее двенадцати миллионов, пробел, затем не менее пяти и не более двенадцати отдельных заглавных букв. В последней строке будет указана нуль и буквы END; это сигнализирует о конце ввода. Для каждой строки выводится уникальная комбинация Klein или «нет решения», если нет правильной комбинации. Используйте точный формат, показанный ниже «

Пример входных данных:.

1 ABCDEFGHIJKL 
11700519 ZAYEXIWOVU 
3072997 SOUGHT 
1234567 THEQUICKFROG 
0 END 

Пример вывода:

LKEBA 
YOXUZ 
GHOST 
no solution 

Профессор написал код вниз, но я просто с трудом делая его смысл заключается в следующем:

package lab2; 
import java.util.Arrays; 

public class Lab2 { 
    public static void main(String[] args) { 
     public static final int MAX_LETTERS = 12; 
     public static final int MIN_LETTERS = 5; 
     private String best; //best solution; 
     private int key; // number in input file 
     private int codes; // number of letters in code 
     int [] k = new int [MAX_LETTERS]; //holds numeric codes 
     public boolean is_solution (int u, int v, int x, int x, int y){ //compute the equation, test if it equals to key, return true or false 
     }//is_solution 
     public void test_combinations(int start){ 
      int i; 
      if (start == MIN_LETTERS){ 
       if (is_solution(k[0], k[1], k[2], k[3], k[4])){ 
        char[] s = new char[5]; 
        s[0] = (char) (k[0] + 'A' - 1); 
        s[1] = (char) (k[1] + 'A' - 1); 
        s[2] = (char) (k[2] + 'A' - 1); 
        s[3] = (char) (k[3] + 'A' - 1); 
        s[4] = (char) (k[4] + 'A' - 1); 
        String sol = Arrays.toString(s); 
        System.out.println("\n Found a Solution " + sol); 
        if (sol.compareTo(best) > 0) 
         best = sol; 
       }//close if is_solution 
      }//if start 
      else{ 
       for (i = start; i<codes; i++){ 
        temp = k[start]; 
        k[start] = k[i]; 
        k[i] = temp; 
        test_combinations(start+1); 
        k[i] = k[start]; 
        k[start] = temp; 
       }//close for 
      }//close else 
     }//test_combinations 

     public lab2(){ 
      //file 
      //try/catch 
      //inside try: read key, read code in a loop - WHILE.HASNEXT 
      //test if(key == 0), break 
      //test code.lenth is between 5 & 12, if not, break 
      //set best to "@@@@@@@" 
      //convert all characters to ordinal values, store them in array k - SUBTRACT 'A' ADD 1 - CHAR.AT 
      charAt(i)-'A'+1 ______ k[i] (assign to) 
       test_combinations(0); 
      //output best 
      //close file 
     }//lab2 
    } 
} 
+2

Он дал вам код, который генерирует возможные комбинации. Вы должны указать логику, которая проверяет, является ли комбинация возможным ключом (в 'is_solution') и кодом для инициализации программы (путем считывания ключа из файла) в' lab2() ' – SJuan76

+0

. Пожалуйста, очистите форматирование на своем код. –

ответ

0

Вам не хватает цикла For, чтобы преобразовать ваши символы в обычное значение для хранения в массив k.Это должно помочь, так что бы

если (codeLength> 5 & & codeLength < 12) {

для (INT I; я < codeLength, я ++) {

k [i] = charAt (i) - 'A' + 1;

Я не понял, что положить в скобках время цикла, но я работаю над этим.

0

Исправленная Lab2 (код) выглядит следующим образом:

public Lab2() { 
    File Safe = new File("Safe.txt"); 
    try { 
     Scanner input = new Scanner(Safe); 
     while (input.hasNext()) { 
      key = input.nextInt(); 
      String s = input.next(); 
      if (key == 0){ 
       break; 
      }    
      if (s.length() < 5 || s.length() > 12){ 
       break; 
      } 
      for (int i = 0; i < s.length(); i++) { 
       k[i] = s.charAt(i) - 'A' + 1; 
      }     
      codes = s.length(); 
      //System.out.printf("Key %d, letters %s (%d) \n," key, s, codes); 
      best = ("@@@@@");//set best to "@@@@@@@"   
      test_combinations(0); 
      if (best.equals("@@@@@")) { 
       System.out.println("No solution."); 
      } 
       else { 
       System.out.println("Best solution: " + best); 
      } 
     } 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
     System.out.println("Execute this."); 
    } 
}