Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 25.03.2019
Сообщений: 6

Вывести на экран числа от 1000 до 9999 такие, что все цифры различны

25.03.2019, 18:52. Показов 6460. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вывести на экран числа от 1000 до 9999 такие, что все цифры различны.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.03.2019, 18:52
Ответы с готовыми решениями:

Вывести на экран числа от 1000 до 9999 такие, что все цифры различны
Вывести на экран числа от 1000 до 9999 такие, что все цифры различны.

Вывести на экран числа от 1000 до 9999 такие, что все цифры различны
Вывести на экран числа от 1000 до 9999 такие, что все цифры различны.

Цикл: Вывести на экран числа от 1000 до 9999 такие, что все цифры различны.
Добрый день! Подскажите, что использовать для решения задач: - Вывести на экран числа от 1000 до 9999 такие, что все цифры различны. ...

28
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
30.03.2019, 02:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ArtemFM Посмотреть сообщение
Stream ввели не для мега крутости, а экономии времени, читабельности кода и уменьшения строк того же кода...
Вот только такое наивное использование стримов приводит к значительному ухудшению производительности программы, хоть оно и простое, более универсальное и легко расширяемое, скажем до диапазона [10000..99999] — достаточно пару цифр добавить.

Java
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import java.util.BitSet;
import java.util.stream.IntStream;
 
final class Nums {
 
    public static void main(String[] args) {
        System.out.println("NaïveStreams:      " + naïveStreams());
        System.out.println("LoopsBoolArray:    " + loopsBoolArray());
        System.out.println("LoopsBitSet:       " + loopsBitSet());
        System.out.println("LoopsBitOperators: " + loopsBitOperators());
 
        printBench(  1_000);
        printBench( 10_000);
        printBench(100_000);
    }
 
    private static void printBench(int ntimes) {
        System.out.println();
        printMillisAsSeconds("NaïveStreams:      ", bench(ntimes, Nums::naïveStreams));
        printMillisAsSeconds("LoopsBoolArray:    ", bench(ntimes, Nums::loopsBoolArray));
        printMillisAsSeconds("LoopsBitSet:       ", bench(ntimes, Nums::loopsBitSet));
        printMillisAsSeconds("LoopsBitOperators: ", bench(ntimes, Nums::loopsBitOperators));
    }
 
    private static long bench(int ntimes, Runnable r) {
        final long start = System.currentTimeMillis();
        for (int i = 0; i < ntimes; i++) {
            r.run();
        }
        return System.currentTimeMillis() - start;
    }
 
    private static void printMillisAsSeconds(String name, long millis) {
        System.out.printf("%s took %7.3f s%n", name, millis / 1000.0);
    }
 
    private static int naïveStreams() {
        return (int) IntStream.rangeClosed(1000, 9999).
                mapToObj(String::valueOf).
                filter(s -> s.chars().distinct().count() == s.length()).
                count();
    }
 
    private static int loopsBoolArray() {
        int iterations = 0;
        final boolean[] exclude = new boolean[10];
        for (int a = 1; a < 10; a++) {
            exclude[a] = true;
            for (int b = 0; b < 10; b++) {
                if (exclude[b]) continue;
                exclude[b] = true;
                for (int c = 0; c < 10; c++) {
                    if (exclude[c]) continue;
                    exclude[c] = true;
                    for (int d = 0; d < 10; d++) {
                        if (exclude[d]) continue;
                        iterations++;
                    }
                    exclude[c] = false;
                }
                exclude[b] = false;
            }
            exclude[a] = false;
        }
        return iterations;
    }
 
    private static int loopsBitSet() {
        int iterations = 0;
        final BitSet exclude = new BitSet(10);
        for (int a = 1; a < 10; a++) {
            exclude.set(a);
            for (int b = 0; b < 10; b++) {
                if (exclude.get(b)) continue;
                exclude.set(b);
                for (int c = 0; c < 10; c++) {
                    if (exclude.get(c)) continue;
                    exclude.set(c);
                    for (int d = 0; d < 10; d++) {
                        if (exclude.get(d)) continue;
                        iterations++;
                    }
                    exclude.clear(c);
                }
                exclude.clear(b);
            }
            exclude.clear(a);
        }
        return iterations;
    }
 
    private static int loopsBitOperators() {
        int iterations = 0;
        int exclude = 0;
        for (int a = 1; a < 10; a++) {
            exclude |= 1 << a;
            for (int b = 0; b < 10; b++) {
                if ((exclude & (1 << b)) != 0) continue;
                exclude |= 1 << b;
                for (int c = 0; c < 10; c++) {
                    if ((exclude & (1 << c)) != 0) continue;
                    exclude |= 1 << c;
                    for (int d = 0; d < 10; d++) {
                        if ((exclude & (1 << d)) != 0) continue;
                        iterations++;
                    }
                    exclude ^= 1 << c;
                }
                exclude ^= 1 << b;
            }
            exclude ^= 1 << a;
        }
        return iterations;
    }
}
=>

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NaïveStreams:      4536
LoopsBoolArray:    4536
LoopsBitSet:       4536
LoopsBitOperators: 4536
 
NaïveStreams:       took   1.842 s
LoopsBoolArray:     took   0.012 s
LoopsBitSet:        took   0.035 s
LoopsBitOperators:  took   0.007 s
 
NaïveStreams:       took  16.253 s
LoopsBoolArray:     took   0.034 s
LoopsBitSet:        took   0.034 s
LoopsBitOperators:  took   0.033 s
 
NaïveStreams:       took 162.053 s
LoopsBoolArray:     took   0.334 s
LoopsBitSet:        took   0.329 s
LoopsBitOperators:  took   0.326 s
162 секунды (почти 3 минуты) против 0.3 секунды на 100_000 итераций, Карл!
3
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
30.03.2019, 03:33
korvin_, спасибо за столь подробный и показательный код. Про экономию времени я имел ввиду не экономия времени работы программы, а экономию времени в написании кода...
А про стримы, на самом деле это как рекурсия, грубо говоря. Лучше написать циклом (про рекурсию) так и про стримы...там иногда много что лишнего создавать приходится или кастить, а объекты создаются долго...

Я имел ввиду, что в таких тривиальных задачах простых о скорости работы программы не особо задумываешься... Но урок усвоил, что лучше 7 раз подумать, чем раз сделать не так ))) Спасибо

Добавлено через 25 минут
и всё таки сдвиги "рулят". Надо учить плотнее
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
30.03.2019, 07:20
Цитата Сообщение от ArtemFM Посмотреть сообщение
Про экономию времени я имел ввиду не экономия времени работы программы, а экономию времени в написании кода...
Я с этим и не спорил.

Цитата Сообщение от ArtemFM Посмотреть сообщение
А про стримы, на самом деле это как рекурсия, грубо говоря. Лучше написать циклом (про рекурсию) так и про стримы...
Не…

Цитата Сообщение от ArtemFM Посмотреть сообщение
и всё таки сдвиги "рулят". Надо учить плотнее
Не особо, в вышеприведённом примере варианты без использования битовых операторов проще и читабельней.
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
30.03.2019, 14:43
korvin_, Неожиданый результат, есть предположения что такой результат не от того что стримы медленные (лямбды-контекст работы стримов, по сути это только сахарок локальных классов, ничего революционного) а от того что у каждого из них свой трэд, скоуп, место в памяти, потому времязатратно их создать, а потом они быстрые. Думаю тут же основная работа их создание, а остальные методы ничего не создают, даже объекты не говоря о своих тредах, а с учетом оптимизации компилятора так еще более выиграшнее.
Классно вы придумали с r.run() над статическим методом "так можно было!?" )))) Почему оно работает, из-за мейна?
0
3 / 3 / 0
Регистрация: 20.12.2018
Сообщений: 232
30.03.2019, 19:26
Цитата Сообщение от ArtemFM Посмотреть сообщение
andr_17, рад за тебя. Интересно какой язык придёт на смену у тебя через месяц или два?! Ведь ты удивишься, что учить везде что-то надо.
P.S. Вдвойне рад, что не будешь больше докучать тут
реально? учить? да ну нафиг!
Сижу смотрю в IDE, и ничего не учу, представляю что кожу

вдруг мой след язык будет опять джава? соскучишься - пиши)
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
30.03.2019, 19:37
ViktorFX, можно было, т.к. мы передали как лямбду метод в функциональный интерфейс Runnable... Типа () -> method() - а это как раз лямбда для run() Runnable

Добавлено через 1 минуту
по сути тоже самое что:

Java
1
2
3
4
5
...
public void run() {
   method();
}
...
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
30.03.2019, 20:22
ArtemFM, я уже статические ссылки читал, но не понял сути, а поскольку память у меня дырявая.. вот сейчас тоже не совсем понял и потом забуду.
Насколько я вас понял, если в объявлении одной функции (bench) как аргумент присутствует ссылка на функциональный интерфейс (Runnable r) то при вызове функции bench в качестве аргумента можно впихнуть статическую ссылку, но! Но должны совпадать сигнатура статической ссылки и фк.интерфейса, и run() и например nativeStreams() одинаково не принимают аргументы, тут они вроде схожи (не помню входит ли возвращаемое значение/ссылка в понятие сигнатура) Но у них разные возвращаемые значения, у void run() и int nativeStrems(). Если так можно, значит я все понял (это и + входит ли возвращаемое значение в понятие сигнатуры, дабы легче запомнить), осталось запомнить
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
30.03.2019, 21:09
по сути Runnable это функциональный интерфейс с методом run который ничего не принимает и не возвращает...
поэтому Корвин просто вызывает в нутри метода run() методы loops... ничего не принимая с них, хоть они и возвращают int

Мы могли использовать вместо Runnable r к примеру Supplier...
Java
1
2
3
public interface Supplier<T> {
    T get();
}
и передать туда ссылки на наши методы и вызывать его в цикле не run(), а get() и возвращал бы он нам тип Т (Integer) в данном случае. Но у Корвина в реализации возврат данных был ни к чему!!!

Добавлено через 6 минут
про совпадения аргументов передаваемых...

Да, мы должны подобрать такой функциональный интерфейс для методов, чтоб подходил для всех, ну или сделать методы под функциональный интерфейс

т.к. методы решения ничего не принимают и возвращают тип int, нам может подойти функциональный интерфейс Runnable (ничего не возвращает и не принимает), Supplier (возвращает тип Т (дженерик) и ничего не принимает) либо написать свой функциональный интерфейс, какой мы захотим под наши нужды

про статические методы... Не обязательно мы можешь передавать только статические методы. Любые методы, если подходят под наш функиональный интерфейспо входящим и приходящим данным
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
30.03.2019, 22:12
Цитата Сообщение от ViktorFX Посмотреть сообщение
есть предположения что …
тебе нужно больше подумать. Посмотреть, в чём отличия алгоритмов, например.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2019, 22:12

Вывести на экран числа от 1000 до 9999 такие, что среди цифр нет цифр 5 и цифры 6
Вывести на экран числа от 1000 до 9999 такие, что среди цифр нет цифр 5 и цифры 6.

Вывести на экран числа от 1000 до 9999 такие, что среди цифр есть цифра 3
Вывести на экран числа от 1000 до 9999 такие, что среди цифр есть цифра 3.

Вывести на экран числа от 1000 до 9999 такие, что среди цифр есть цифра 3
Вывести на экран числа от 1000 до 9999 такие, что среди цифр есть цифра 3.

Вывести числа из диапазона от 1000 до 9999, цифры которых различны
Как работает эта программа? #include &lt;iostream&gt; using namespace std; int main() { for (int i = 1000; i &lt;= 9999;...

Вывести на экран числа от 1000 до 9999 такие среди, которых нет 5 и 6
Вывести на экран числа от 1000 до 9999 такие, что среди цифр нет цифры 5 и цифры 6


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Химера правил, администации порталов, законы и беззаконие.
Hrethgir 26.06.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11904&stc=1&d=1782459438 У меня сейчас так везде по форуму - не могу создавать сообщений, но запись по случаю этому. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru