- 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);
}
}
Моё. Программа выводит те числа, в которых, а также в умноженных на два числах, все цифры уникальные. Только начинаю изучать яву, не бейте, лучше обоссыте.
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) же.
Ну, раз используешь сканер и nextByte, обработай исключение, которое может выкинуть nextByte, или же вызови hasNextByte, и если оно вернет false, сообщи юзеру об ошибке.
2. Вместо log10 (вещественнозначной функции, при том, что в задаче только целые числа) лучше считать, сколько в числе оказалось цифр, и выходить из цикла, если их больше n. (А вдруг нам понадобится считать цифры, скажем, в 13-ричной системе? Писать log13?)
3. Настоящий WTF - это "// Цикл выполниться вдвое больше раз, чем разрядность искомых чисел." Почему бы не вынести эту проверку в функцию и не вызывать её дважды, для i и для i*2?
UPD: упс, все скомпилится, не знал, что в яве есть неленивые логические операторы | и &.
boolean ok = transform1(m) & transform2(m);
m - изменяемый объект
P.S. А все-таки скучная она, эта жаба - UB-ов, и unspecified-ов нигде не оставляют ;(
А это идея, сейчас организую, только немного по-другому.
лол
Если мы посмотрим реализацию Integer.toString(): http://www.docjar.com/html/api/java/lang/Integer.java.html
то увидим - правильно! - что она оптимизирована именно для десятичной системы.
Для всех остальных используется простой интуитивный алгоритм с div/mod base, похожий на реализованный здесь. А вот для десятичной используется хитрый алгоритм с делением на 100, генерирующий по две цифры зараз, а для маленьких чисел <= 65536 там вообще какая-то хитромудрая оптимизация.
Правда, тогда будет оверхед на выделение для каждого числа нового массива char[] и нового же String. А вот если вытащить алгоритм из исходников JDK, но оперировать одним статическим массивом фиксированного размера, можно и выиграть по сравнению с простым алгоритмом.
А нужно ли? Основной алгоритм у меня получился довольно быстрый: http://pastebin.com/CfkkibxM
Мне вообще нужна программа на паскале (лаба), а не на джаве.
Теперь хочу сравнить, кто будет быстрее.
про див на асме я пошутил, конечно
твой метод (val/8-val/32) я тоже пробовал, но он даёт хуйню уже на val=8
Поэтому только умножение на 2**32/10 с возвратом edx
Оно не врёт для всех чисел, в которых меньше 10 знаков.
http://liveworkspace.org/code/3ZwfYS$4
Мозг
Ты меня троллишь? Мне никогда не приходилось работать с кешем процессора, поэтому я не знаю как туда что-либо положить.
Лол. Ты мне не поверишь, но твои программы с завидной реглярностью что-нибудь кладут в кеш процессора, когда в программе происходит обращение к адрессному пространству процесса.
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.
Тут слово «выполнится» надо написать без мягкого знака (что сделаетЪ?).