Или вы можете использовать свойство чисел вампира, описанных на this page (связанный из Википедии):
важный теоретический результат, полученный Пит Хартли:
If x·y is a vampire number then x·y == x+y (mod 9)
Доказательство: Пусть мод будет бинарный модульный оператор, а d (x) - сумма десятичной цифры цифр x. Хорошо известно, что d (x) mod 9 = x mod 9 для всех x. Предположим, x · y - вампир. Затем он содержит те же цифры, что и x и y, и, в частности, d (x · y) = d (x) + d (y). Это приводит к: (x · y) mod 9 = d (x · y) mod 9 = (d (x) + d (y)) mod 9 = (d (x) mod 9 + d (y) mod 9) mod 9 = (x mod 9 + y mod 9) mod 9 = (x + y) mod 9
Решения для congruence являются (x mod 9, y mod 9) в {(0,0) , (2,2), (3,6), (5,8), (6,3), (8,5)}
Так что ваш код может выглядеть следующим образом:
for(int i=18; i<100; i=i+9){ // 18 is the first multiple of 9 greater than 10
for(int j=i; j<100; j=j+9){ // Start at i because as @sh1 said it's useless to check both x*y and y*x
checkVampire(i,j);
}
}
for(int i=11; i<100; i=i+9){ // 11 is the first number greater than 10 which is = 2 mod 9
for(int j=i; j<100; j=j+9){
checkVampire(i,j);
}
}
for(int i=12; i<100; i=i+9){
for(int j=i+3; j<100; j=j+9){
checkVampire(i,j);
}
}
for(int i=14; i<100; i=i+9){
for(int j=i+3; j<100; j=j+9){
checkVampire(i,j);
}
}
// We don't do the last 2 loops, again for symmetry reasons
Так как они представляют собой 40 элементов в каждом из наборов, таких как {(x mod 9, y mod 9) = (0,0); 10 <= x <= y <= 100}
, вы делаете только 4*40 = 160
итераций, когда грубая сила дает вам 104 итерации. Вы можете сделать еще меньше операций, если принять во внимание ограничение >= 1000
, например, вы можете избежать проверки, если j < 1000/i
.
Теперь вы можете легко масштабировать, чтобы найти вампиров с более чем 4-х цифр =)
Это напоминает мне старые времена, когда мы пытались решить такие вопросы в ACM ICPC .... –
не можешь просто перебирать все 9000 возможностей? Это не так много? Просто начните с '1000', что означает' 10 * 00', проверьте, является ли результат вампиром. –
Или, альтернативно, просто вложенный цикл над потенциальными факторами - умножьте их и проверьте результат ... По крайней мере, для 2-значного -> 4-значного случая. Теперь, если вы хотите найти все 128-значные -> 256-значные случаи, это совершенно другой масштаб проблемы ... – twalberg