Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.Scanner;
- public class Main {
- private static final Scanner scanner = new Scanner(System.in);
- public static void main(String[] args) {
- int[] answerNumbers;
- int number;
- taskEssence();
- number = sourceChoice();
- answerNumbers = checkForNumbers(number);
- output(answerNumbers);
- }
- public static int[] checkForNumbers(int number) {
- int countOfNumbers = 0;
- int maxExponent = 0;
- while ((1 << maxExponent) - 1 < number) {
- maxExponent++;
- }
- for (int i = 0; i < maxExponent; ++i) {
- int mersenneNumber = (1 << i) - 1; // 2^i - 1
- if (mersenneNumber < number) {
- countOfNumbers++;
- }
- }
- int[] resultNumbers = new int[countOfNumbers];
- int index = 0;
- // Заполняем массив числами Мерсенна
- for (int i = 0; i < maxExponent; ++i) {
- int mersenneNumber = (1 << i) - 1;
- if (mersenneNumber < number) {
- resultNumbers[index] = mersenneNumber;
- index++;
- }
- }
- int[] answerNumbers = new int[countOfNumbers];
- System.arraycopy(resultNumbers, 0, answerNumbers, 0, countOfNumbers);
- return answerNumbers;
- }
- public static void taskEssence() {
- System.out.println("Данная программа находит все числа Мерсенна, которые меньше введенного N.");
- }
- public static int sourceChoice() {
- int choiceNumber;
- boolean isIncorrect;
- choiceNumber = -1;
- int num;
- System.out.println("Выберите, откуда будут вводиться данные: ");
- do {
- isIncorrect = false;
- System.out.println("Введите 0, если с консоли; 1, если с файла");
- try {
- choiceNumber = Integer.parseInt(scanner.nextLine());
- } catch (NumberFormatException exception) {
- isIncorrect = true;
- System.err.println("Неверный ввод данных!");
- }
- if (((choiceNumber != 0) && (choiceNumber != 1)) || (isIncorrect)) {
- isIncorrect = true;
- System.err.println("Число должно быть или 0, или 1");
- }
- } while (isIncorrect);
- if (choiceNumber == 0) {
- num = fromConsole();
- } else {
- num = fromFile();
- }
- return num;
- }
- public static int fromFile() {
- String path;
- int number;
- path = pathChoice();
- number = numberReadFile(path);
- outputNumber(number);
- return number;
- }
- public static String pathChoice() {
- String path;
- boolean isIncorrect;
- do {
- isIncorrect = false;
- System.out.println("Введите путь к файлу: ");
- path = scanner.nextLine();
- File file = new File(path);
- if (!file.exists()) {
- System.out.println("По указанном пути файл не найден.");
- isIncorrect = true;
- } else if (!getExtension(path).equals("txt")) {
- System.err.println("Ошибка, неправильный тип файла!");
- isIncorrect = true;
- }
- } while (isIncorrect);
- return path;
- }
- public static String getExtension(String path) {
- int pos = path.lastIndexOf('.');
- if (pos <= 0) {
- return "";
- }
- return path.substring(pos + 1);
- }
- public static int numberReadFile(String path) {
- boolean isIncorrect;
- int number = 0;
- System.out.println("Считывание числа...");
- isIncorrect = false;
- try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
- try {
- number = Integer.parseInt(reader.readLine());
- } catch (NumberFormatException exception) {
- isIncorrect = true;
- }
- if(isIncorrect || (number < 1)) {
- System.out.println("Неверный ввод данных! Запишите данные с клавиатуры.");
- number = fromConsole();
- }
- } catch (IOException ioException) {
- isIncorrect = true;
- System.err.println("Ошибка!");
- }
- return number;
- }
- public static void output(int[] answerNumbers) {
- String path;
- boolean isIncorrect;
- System.out.println("Найденные числа Мерсенна: " );
- for (int i = 0; i < answerNumbers.length; i++) {
- System.out.println(answerNumbers[i]);
- }
- path = outputPath();
- do {
- isIncorrect = false;
- try (FileWriter writer = new FileWriter(path, true)) {
- writer.write("Найденные числа Мерсенна: \n" );
- for (int i = 0; i < answerNumbers.length; i++) {
- writer.write(Integer.toString(answerNumbers[i]));
- }
- } catch (IOException ioException) {
- System.err.println("Ошибка при записи в файл");
- isIncorrect = true;
- }
- } while (isIncorrect);
- System.out.println("Данные записаны в файл.");
- }
- public static String outputPath() {
- String path;
- boolean isIncorrect;
- do {
- isIncorrect = false;
- System.out.println("Введите путь к файлу для вывода: ");
- System.out.println();
- path = scanner.nextLine();
- File file = new File(path);
- if (!file.exists()) {
- System.out.println("По указанном пути файл не найден.");
- isIncorrect = true;
- } else if (!getExtension(path).equals("txt")) {
- System.err.println("Ошибка, неправильный тип файла!");
- isIncorrect = true;
- }
- } while (isIncorrect);
- return path;
- }
- public static int fromConsole() {
- int number = 0;
- boolean isIncorrect;
- do {
- isIncorrect = false;
- System.out.println("Введите натуральное число:");
- try {
- number = Integer.parseInt(scanner.nextLine());
- } catch(NumberFormatException exception) {
- isIncorrect = true;
- }
- if(isIncorrect || (number < 1)) {
- System.out.println("Ошибка! Повторите попытку.");
- isIncorrect = true;
- }
- } while(isIncorrect);
- outputNumber(number);
- return number;
- }
- public static void outputNumber(int number) {
- System.out.println("Введенное число:");
- System.out.println(number);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement