JavaRush /Java блог /Random UA /Як у Java надрукувати числа від 1 до 100 без циклів та ум...

Як у Java надрукувати числа від 1 до 100 без циклів та умов?

Стаття з групи Random UA
Ця посада призначена насамперед для тих, хто готується до співбесід. Саме там люблять задавати подібні головоломки. Насправді поставлене завдання легше і логічніше вирішувати саме з циклами та умовами. І, думаємо, будь-який студент JavaRush зможе це зробити після четвертого рівня квесту Java Syntax . Але переважна більшість наведених способів розраховані на тих, хто вже «зайшов» у Java Multithreading . Примітка: йдеться про те, щоб не використовувати цикли та умови безпосередньо. Насправді вони неявно "вшиті" у більшість зазначених рішень. Як у Java надрукувати числа від 1 до 100 без циклів та умов?  - 1
Можливо, у вас є своє рішення для цього завдання? Діліться у коментарях!

Отже, спосіб 1 просто напиши це!

Зрозуміло, перше, що спадає на думку новачкові — прямий перебір. Нераціонально, але й зрозуміло. Точно так, як ми вирішували завдання на перших рівнях JavaRush.
System.out.println("1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 ,
21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 ,
43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 ,
65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 ,
97 , 98 , 99 , 100"
);
Але, погодьтеся, це якось нудно. Тому можна скористатися другим способом.

Спосіб 2: використовуй рядки та перевизначення toString

public static void main(String[] args) {

        Object[] numbers = new Object[100];
        Arrays.fill(numbers, new Object() {    //создаем анонимный класс
            private int count = 0;
            @Override
            public String toString() {
                return Integer.toString(++count);
            }
        });
        System.out.println(Arrays.toString(numbers));

    }
Інструкція @Overrideпоказує, що збираємося перевизначити метод базового класу. У разі ми перевизначаємо toString. Насправді це, як і багато наступних варіантів рішення містять цикли. Просто ці цикли вшиті у використовувані методи.

Спосіб 3: використовуй рекурсію

Щоб зрозуміти рекурсію, потрібно зрозуміти рекурсію. Рекурсія чи виклик функцією самої себе – тема дуже цікава, і не завжди зрозуміла одразу. На JavaRush її проходять у квесті Java Collections (для повноти картинки), але насправді її можна зрозуміти і використовувати (або не використовувати… чому - дізнаєтесь під час вивчення теми!) набагато раніше, одразу після вивчення циклів та умовних переходів.
public class Recursion {

    public void ShowNums(int i) {
    // метод, который печатает

        int x = 1;

// блок try проверяет, достигли ли мы нуля
        try {
            int m = x / i;				// здесь выбрасывается исключение при i = 0
            System.out.println(i);
            i--;
            ShowNums(i);				// а вот и рекурсивный вызов
        }
        catch(ArithmeticException e) {
		// деление на нуль выбрасывает ArithmeticException
            return;					// Останавливается при попытке деления на нуль
        }

    }

     public static void main(String[] args) {

        Recursion r = new Recursion();
        r.ShowNums(100);				// вызов метода со значенням 100
    }

}
Зверніть увагу:тут висновок виробляється над прямому, а зворотному порядку. Спробуйте змінити код, щоб числа виводабося так, як сказано в умові, тобто від 1 до 100. Чекаємо на рішення в коментарях!

Спосіб 4: використовуй семафори

public class To100 {
    public static void main(String[] args) {
        final int max = 100;
        new java.util.concurrent.Semaphore(max) {
            void go() {
                acquireUninterruptibly();
                System.err.println(max-availablePermits());
                go();
            }
        }.go();
    }
}
Семафори – це засіб синхронізації для доступу до ресурсу. У Java семафори представлені класомSemaphoreбібліотекиjava.util.concurrent.

Спосіб 5: використовуй нитки

public class Counter extends Thread{

    private int cnt;

    public Counter(){
        this.cnt = 0;
    }

    private void increment(){
        System.out.println(cnt++);
        try{
            Thread.sleep(1000);
        }catch(Exception e){}
        increment();
    }

    public void run(){
        increment();
    }

    public static void main(String[] args) throws Exception{
        Counter cntr = new Counter();
        cntr.start();
        cntr.join(100000);
        cntr.interrupt();
        System.exit(0);
    }
}

Спосіб 6: знай свої бібліотеки!

У Java є багато цікавого. Наприклад, клас java.util.BitSet. Він дозволяє створити бітовий вектор, розмір якого динамічно змінюється. Тобто об'єкт класу BitSet- якийсь упорядкований набір бітів зі значеннями trueабо false. Спочатку всі біти рівні false. Для зберігання набору виділяється обсяг пам'яті, необхідний для зберігання вектора аж до старшого біта, який встановлювався або скидався в програмі - всі біти, що його перевищують, вважаються рівними false.
public class To100 {
    public static void main(String[] args) {
        String set = new java.util.BitSet() {{ set(1, 100+1); }}.toString();
        System.out.append(set, 1, set.length()-1);
    }
}

Спосіб 7: використовуй клас Vector

Так, клас вектор — застарілий і використовується вкрай рідко. Проте чому б і ні?
import java.util.Vector;

public class PrintOneToHundered {
  static int i;
  PrintOneToHundered() {}
  public String toString() { return ++i+""; }
  public static void main(String[] args) {
    Vector v1  =new Vector(); v1  .add(new PrintOneToHundered());
    Vector v2  =new Vector(); v2  .addAll(v1 ); v2  .addAll(v1 );
    Vector v4  =new Vector(); v4  .addAll(v2 ); v4  .addAll(v2 );
    Vector v8  =new Vector(); v8  .addAll(v4 ); v8  .addAll(v4 );
    Vector v16 =new Vector(); v16 .addAll(v8 ); v16 .addAll(v8 );
    Vector v32 =new Vector(); v32 .addAll(v16); v32 .addAll(v16);
    Vector v64 =new Vector(); v64 .addAll(v32); v64 .addAll(v32);
    Vector v100=new Vector(); v100.addAll(v64); v100.addAll(v32); v100.addAll(v4);
    System.out.println(v100);
  }
}
За матеріалами Quora
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ