- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
package javaapplication2;
import java.util.*;
public class JavaApplication2 {
public static void main(String[] args) {
int temp; byte n;
Scanner in = new Scanner(System.in);
System.out.print("Введите разрядность искомых чисел: "); n = in.nextByte();
if (n < 1 | n > 5) {
System.out.println("Всего чисел: 0");
return;
}
int i = (int)Math.pow(10, (n - 1)); // i - минимальное число. Пр: 1, 10, 100, 1000, 10000
int count = 0;
while ( (int)Math.log10(i*2) + 1 == n) { // Цикл выполняется пока кол-во цифр в числе i равно числу n.
boolean unqie = false;
temp = i;
int[] g = new int[10];
for (int j = 0; j < (n*2); j++) // Цикл выполниться вдвое больше раз, чем разрядность искомых чисел.
{
g[temp % 10]++;
if (g[temp % 10] > 1) {
unqie = true;
break;
}
temp /= 10; // Отбрасываем последнюю проверенную цифру.
if (temp <= 0) { // После того, как проверили первое число на уникальность,
temp = i*2; // проверяем второе, которое в 2 раза больше первого.
}
}
if ( unqie == false) { // Если число прошло проверку на уникальность, выводим его на экран.
count++;
System.out.printf("%s %s \n", i, i*2);
}
i++;
}
System.out.printf("Всего: %s numbers \n", count);
}
}
Моё. Программа выводит те числа, в которых, а также в умноженных на два числах, все цифры уникальные. Только начинаю изучать яву, не бейте, лучше обоссыте.
bormand 04.01.2013 20:05 # +3
1) Строки 11-12 - стоит выдать какую-нибудь приличную фразу, говорящую пользователю о его ошибке в духе "Разрядность должна быть от 1 до 5", т.к. для разрядностей 6+ задача не имеет смысла.
2) Логарифм в цикле - это удар процессору по яйцам, лучше заранее рассчитай число, до которого будет идти цикл (например по аналогии со строкой 16).
3) unqie - во-первых unique, во-вторых в данном коде оно используется как notUnique, стоит или переименовать его, или инвертировать условия и true/false в строках 20, 28, 38.
4) Кривой коммент в строке 19 - не в числе i, а в числе i*2
5) > if ( unqie == false)
Индус детектед. if (!unqie) же.
Govnocoder#0xFF 04.01.2013 20:25 # −1
bormand 04.01.2013 20:32 # 0
Ну, раз используешь сканер и nextByte, обработай исключение, которое может выкинуть nextByte, или же вызови hasNextByte, и если оно вернет false, сообщи юзеру об ошибке.
someone 04.01.2013 20:09 # +3
2. Вместо log10 (вещественнозначной функции, при том, что в задаче только целые числа) лучше считать, сколько в числе оказалось цифр, и выходить из цикла, если их больше n. (А вдруг нам понадобится считать цифры, скажем, в 13-ричной системе? Писать log13?)
3. Настоящий WTF - это "// Цикл выполниться вдвое больше раз, чем разрядность искомых чисел." Почему бы не вынести эту проверку в функцию и не вызывать её дважды, для i и для i*2?
bormand 04.01.2013 20:11 # 0
UPD: упс, все скомпилится, не знал, что в яве есть неленивые логические операторы | и &.
Govnocoder#0xFF 04.01.2013 20:28 # 0
roman-kashitsyn 04.01.2013 20:31 # +4
bormand 04.01.2013 20:36 # +3
Lure Of Chaos 05.01.2013 10:57 # 0
boolean ok = transform1(m) & transform2(m);
m - изменяемый объект
myzone 05.01.2013 18:20 # +2
Lure Of Chaos 06.01.2013 12:23 # +2
bormand 07.01.2013 15:11 # 0
roman-kashitsyn 07.01.2013 16:03 # 0
bormand 07.01.2013 18:20 # +1
P.S. А все-таки скучная она, эта жаба - UB-ов, и unspecified-ов нигде не оставляют ;(
Govnocoder#0xFF 04.01.2013 20:30 # 0
А это идея, сейчас организую, только немного по-другому.
roman-kashitsyn 04.01.2013 20:15 # +3
лол
Lure Of Chaos 05.01.2013 10:58 # −2
Govnocoder#0xFF 05.01.2013 12:49 # +4
someone 05.01.2013 16:41 # 0
Если мы посмотрим реализацию Integer.toString(): http://www.docjar.com/html/api/java/lang/Integer.java.html
то увидим - правильно! - что она оптимизирована именно для десятичной системы.
Для всех остальных используется простой интуитивный алгоритм с div/mod base, похожий на реализованный здесь. А вот для десятичной используется хитрый алгоритм с делением на 100, генерирующий по две цифры зараз, а для маленьких чисел <= 65536 там вообще какая-то хитромудрая оптимизация.
Правда, тогда будет оверхед на выделение для каждого числа нового массива char[] и нового же String. А вот если вытащить алгоритм из исходников JDK, но оперировать одним статическим массивом фиксированного размера, можно и выиграть по сравнению с простым алгоритмом.
Govnocoder#0xFF 05.01.2013 17:01 # −1
А нужно ли? Основной алгоритм у меня получился довольно быстрый: http://pastebin.com/CfkkibxM
Мне вообще нужна программа на паскале (лаба), а не на джаве.
Govnocoder#0xFF 05.01.2013 20:07 # 0
Теперь хочу сравнить, кто будет быстрее.
TarasB 05.01.2013 22:04 # +1
TarasB 05.01.2013 22:27 # +3
Govnocoder#0xFF 05.01.2013 23:38 # +1
TarasB 06.01.2013 00:01 # 0
LispGovno 06.01.2013 12:08 # +1
TarasB 06.01.2013 12:48 # +3
про див на асме я пошутил, конечно
твой метод (val/8-val/32) я тоже пробовал, но он даёт хуйню уже на val=8
Поэтому только умножение на 2**32/10 с возвратом edx
Оно не врёт для всех чисел, в которых меньше 10 знаков.
LispGovno 06.01.2013 13:06 # 0
http://liveworkspace.org/code/3ZwfYS$4
Govnocoder#0xFF 06.01.2013 13:58 # 0
roman-kashitsyn 06.01.2013 14:01 # −1
Govnocoder#0xFF 06.01.2013 15:35 # +1
TarasB 06.01.2013 19:34 # +3
LispGovno 06.01.2013 19:35 # −1
Мозг
XYPO3BO3 17.12.2019 06:02 # 0
TarasB 06.01.2013 14:07 # +1
Govnocoder#0xFF 06.01.2013 15:14 # 0
Ты меня троллишь? Мне никогда не приходилось работать с кешем процессора, поэтому я не знаю как туда что-либо положить.
LispGovno 06.01.2013 19:28 # −4
Лол. Ты мне не поверишь, но твои программы с завидной реглярностью что-нибудь кладут в кеш процессора, когда в программе происходит обращение к адрессному пространству процесса.
LispGovno 07.01.2013 12:06 # +1
TarasB 06.01.2013 19:33 # +2
LispGovno 06.01.2013 19:33 # −1
PREFETCH loads either non-temporal data or temporal data in the specified cache level. As this instruction merely provides a hint to the hardware, it will not generate exceptions or faults.
Govnocoder#0xFF 07.01.2013 16:34 # 0
wissenstein 06.01.2013 17:31 # −2
Тут слово «выполнится» надо написать без мягкого знака (что сделаетЪ?).