- 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
- 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
class PseudoVamp {
public int num;
public boolean truevamp = false;
public int x;
public int y;
public int n1;
public int n2;
public int n3;
public int n4;
void breaknsort() {
n1 = num % 10;
n2 = num / 10 % 10;
n3 = num / 100 % 10;
n4 = num / 1000;
int tmp;
for (int i = 0; i < 4; i++) {
if (n1 > n2) {
tmp = n1;
n1 = n2;
n2 = tmp;
}
if (n2 > n3) {
tmp = n2;
n2 = n3;
n3 = tmp;
}
if (n3 > n4) {
tmp = n3;
n3 = n4;
n4 = tmp;
}
}
}
public PseudoVamp(int a, int b) {
x = a;
y = b;
num = x * y;
breaknsort();
}
}
public class Test {
static void checkvamp(PseudoVamp vamp) {
int x1 = vamp.x % 10;
int x2 = vamp.x / 10;
int y1 = vamp.y % 10;
int y2 = vamp.y / 10;
int tmp;
for (int i = 0; i < 4; i++) {
if (x1 > x2) {
tmp = x1;
x1 = x2;
x2 = tmp;
}
if (x2 > y1) {
tmp = x2;
x2 = y1;
y1 = tmp;
}
if (y1 > y2) {
tmp = y1;
y1 = y2;
y2 = tmp;
}
}
if (vamp.n1 == x1 && vamp.n2 == x2 && vamp.n3 == y1 && vamp.n4 == y2)
vamp.truevamp = true;
}
public static void main(String[] args) {
for (int i = 11; i < 100; i++) {
for (int j = 11; j < 100; j++) {
PseudoVamp v = new PseudoVamp(i, j);
if (v.num < 1000)
continue;
if (v.num > 9999)
return;
checkvamp(v);
if (v.truevamp)
System.out.println(v.x + " * " + v.y + " = " + v.num);
}
}
}
}
A vampire number has an even number of digits and is formed by multiplying a pair of numbers containing half the number of digits of the result. The digits are taken from the original number in any order. Pairs of trailing zeroes are not allowed. Examples include:
1260 = 21 * 60
1827 = 21 * 87
2187 = 27 * 81
Write a program that finds all the 4-digit vampire numbers.
w/o using of arrays.
так что, новая формула для гетов, товарищи.
Уже не прокатит, 6880 - максимальное.
Вывод:
Но гораздо интересней работать только с числами, без массивов / списков. Попробуйте =)
Не "говнорешение" у меня укладывается в 28 строк.
Но "самостоятельность" все равно в таком случае никуда не убрать:
это решение конкретной задачи. Для маштабирования нужны списки полюбому.
Вот математический способ проверить, совпадают ли все цифры в двух числах (JS):
Вот тесты:
уж не проще ли обойтись без математики, а обращаться с числами как со строками?
Видите ли, ваш код на Haskell неподготовленному человеку еще менее понятен. Хотя, конечно, я считаю такой код в функциональном стиле более выразительным, чем та императивная каша, что я написал.
а вот JS вроде как и лучше дожен воспринимать, так наоборот нифига не понял каким образом оно решает поставленную задачу...
С чего это? order - это число цифр в десятичной записи, которые нам нужно рассмотреть. Избавиться от него мы не можем.
К тому же, мы проверяем совпадение всех цифр в числе без учета их позиции, поэтому отсекать по принципу "разные порядки" мы не можем - если вы это имели в виду под "порядки разные".
>Особо порадовала идея использовать числа как небольшие битовые карты =)
Именно благодаря этому я смог уйти от массивов. Другого способа отмечать найденные совпадения я не придумал.
how much watch?
Ещё как можем. Какой смысл сравнивать 12345 с 1234? Число цифр в десятичной записи у них разное, поэтому совпадать наборы цифр не могут априори. Вы и сами без труда сможете написать функцию определения числа десятичных знаков в записи числа:
> Именно благодаря этому я смог уйти от массивов
Спасибо, кэп )
Ответы выдаёт верные, но код работает очень медленно (скорее всего, его тормозит вычисление всевозможных перестановок цифр, которые у вас вычислены ручками, ибо замена Integer на Int ничего не изменила).
Исходный вариант решает задачу за 0.012 сек, этот - за 3.253 сек.
Решения задачи этим вариантом для размерности 6 я не дождался, исходный вариант считает задачу этой размерности 1 сек. Ваш вариант на java у меня отрабатывает за 0.035 сек.
p.s. неделя бенчмарков на ГК
week PseudoTroll {}
}
Я конечно плохо незнаю хаскель, но тут явное читерство :-P
общего решения, мне кажется, простой арифметикой не добиться