Круговой массив Java

Рейтинг: -1Ответов: 1Опубликовано: 17.01.2023

В общем задание написать круговой массив, которая выводит путь, по которому, двигаясь интервалом длины m по заданному массиву, концом будет являться первый элемент. Началом одного интервала является конец предыдущего. Путь - массив из начальных элементов полученных интервалов, на ввод будет даваться m и n. Я написал программу, но она выдает не тот порядок что мне требуется Должно быть так:

Пример 1:
n = 4, m = 3
Решение:
Круговой массив: 1234.
При длине обхода 3 получаем интервалы: 123, 341.
Полученный путь: 13.

Пример 2:
n = 5, m = 4
Решение:
Круговой массив: 123456.
При длине обхода 4 получаем интервалы: 1234, 4512, 2345, 5123, 3451.
Полученный путь: 14253

А моя программа выдает при n = 5 m = 4 путь: 15432

import java.util.Scanner;

public class CircularArray {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter the number of elements in the array: ");
        int n = sc.nextInt();
        System.out.print("Enter the interval length: ");
        int m = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = i + 1;
        }
        int current = 0;
        System.out.print("Path: ");
        for (int i = 0; i < n; i++) {
            System.out.print(arr[current]);
            current = (current + m) % n;
        }
    }
}

вывод консоли

Ответы

▲ 1Принят

Цикл for здесь не совсем подходит, лучше использовать do-while.

Также следует откорректировать вычисление "следующего" значения (индекса конца отрезка), он будет на 1 меньше, по условию задачи:

Началом одного интервала является конец предыдущего

Косметическое улучшение: можно инициализировать значения массива при помощи Arrays::setAll

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("Enter the number of elements in the array: ");
    int n = sc.nextInt();
    System.out.print("Enter the interval length: ");
    int m = sc.nextInt();
        
    int[] arr = new int[n];
    Arrays.setAll(arr, i -> ++i);

    int current = 0;
    System.out.print("Path: ");
    do {
        System.out.print(arr[current]);
        current = (current + m - 1) % n;
    } while (current != 0);
}

Вывод:

Enter the number of elements in the array: 5
Enter the interval length: 4
Path: 14253

Enter the number of elements in the array: 4
Enter the interval length: 3
Path: 13

Как заметил @StanislavVolodarskiy, массив в данной задаче не нужен, можно просто вычислять следующие элементы в последовательности от 1 до n с небольшой коррекцией:

int current = 1;
System.out.print("Path: ");
do {
    System.out.print(current);
    current = (current + m - 2) % n + 1; // сдвиг на 1
} while (current != 1);