Pull to refresh

Comments 69

Уважаемые минусующие!
Идите лесом!
Задачка решается на БУМАГЕ, за 3 МИНУТЫ, имеет множество решений, так же как и множество вариантов этой задачи!
тоесть задача может быть например не abcde * 2 = bcdea, а abcde * 3 = bcdea или *5, и тоже будет иметь решение.

Вот одно из чисел — которое я получил на БУМАГЕ за 2 минуты.

105 263 157 894 736 842
Реально круто. А можете объяснить ход решения?
круто.
но у вас получилось число в два раза больше, а по условию нужно получить в два раза меньше
UFO landed and left these words here
ПОчему не удовлетворяет? abcde это только чтобы принцип был понят, а так мог я написать и abc и abcdefghikl
Да-да-… я ошибся… Извиняйте. число для «минуса» будет 2 105 263 157 894 736 842
UFO landed and left these words here
Это решение совсем другой задачи
abcde * 2 = eabcd
Это решение обоих задач:

210 526 315 789 473 684 = 2 * 105 263 157 894 736 842
210 526 315 789 473 684 = 421 052 631 578 947 368 / 2
Это не решение. Вернее, как справедливо заметили выше, решение не той задачи
210 526 315 789 473 684 * 2 = 4210 526 315 789 473 68 (на конце не 2, как должно быть)
В общем то в самом посте ошибка, пример abcde * 2 = bcdea не верен по постановке задачи.

Задача же звучит как раз как abcde * 2 = eabcd.
Как Вы собственно ниже и заметили =)
Ну abcde можно представить как 10000a+1000b+100c+10d+e
bcdea как 10000b+1000c+100d+10e+a
Получили
20000a+2000b+200c+20d+2e=10000b+1000c+100d+10e+a
19999a-8000b-800c-80d-8e=0
Получается диофантово уравнение, а в случае с произвольной разрялностью, оно похоже не имеет решения в общем виде.
UFO landed and left these words here
а что должно быть понятно?

Решения-то нет потому, что числа вида 199...99 не делятся не 8, сколько бы 9-ок в них не было.
UFO landed and left these words here
UFO landed and left these words here
UFO landed and left these words here
UFO landed and left these words here
Если задача про дяситичную систему, то решения нет.
Действительно, по условию задачи должно быть:
10*a+b = 2*(b*10^n+a), где b — цифра, a — любое число, а n — количество цифр в a.

Тогда получим b*(2*10^n-1)=8*a,
но так как 2*10^n-1 на 2 не делится, то b должно делится на 8, т.е. равнятся 8, а значит a должно равняться 2*10^n-1. В последнем числе, очевидно, n+1 цифр, а в a — n, следовательно, равенство никогда не выполняется.
Где-то вы облажались, поскольку решения существуют и выше даже есть пример от damnet- 210526315789473684.
Во время решения специально перепроверил условие, хотел уточнить, какое из двух чисел меньшее, и все-же сделал ошибку:)
Вот так и непонятно, одни говорят «тривиальная задача», другие что ее вообще невозможно решить. Так есть «официальная версия решения» :)?
мдя, я лет 100500 так считать буду. сейчас переведу на BigInteger (теоретически бесконечное число) и пусть кто-нибудь, кто располагает большими выч. мощностями стучит в личку :-D
готово, ну что, у кого есть сервер с INTEL QUADx8 128 GB RAM с jvm? )
слабовата у вас скорость перебора. Я довёл до 420 миллионов проверок в секунду на одном ядре, примерно 8,6 такта процессора на проверку одного числа. Инт ущитывается весь за несколько секунд, а вот 8ми байтовой целое будет считаться очень долго, чтобы найти число которое приведено в комментариях мне потребуется 8 лет. Я конечно еще на 25% разгонял брутер, но она некрасивый по коду получается. Ну многопоточность, даже на 16 ядрах будем пол года считать до первого числа. А уж о выявлении всех таких чисел даже в диапазоне 8ми байт я просто молчу
>BigInteger
>int
>ай, бида-бида, нативный int быстрее BigInteger
420 миллионов штук в секунду это я 8ми битовые инты перебираю, всё равно их считать более 10 лет.
В двоичной системе исчисления умножение на 2 делается как раз сдвигом влево.
Что-то у меня получилось что нет целочисленного решения :)

abcde*2 = bcdea
2(10000a + 1000b + 100c + 10d + e )=10000b+ 1000c + 100d + 10e + a
20000a + 2000b + 200c + 20d + 2e = 10000b+ 1000c + 100d + 10e + a
a=20000a + 2000b + 200c + 20d + 2e-10000b-1000c — 100d — 10e
-19999a = 2000b + 200c + 20d + 2e-10000b-1000c — 100d — 10e

a=(2000b + 200c + 20d + 2e-10000b-1000c — 100d — 10e)/-19999
a=(8000b + 800c +80d + 8e)/19999

19999a=8*bcde

19999*a/8=bcde

a может изменяться в пределах от 0 до 4 включительно (иначе bcdea было бы больше на порядок)

Чисел от 0 до 4, которые, будучи помноженными на 2499,875 (это 19999/8) давали бы целочисленный результат я не знаю :)

bcde=19999*a/8
Вы, как и многие здесь, не обратили внимание на «разрядность не ограничена», а почему-то решили что число пятизначное)
Суть задачи: найти число, которое, если взять последнюю цифру...

В моем понимании цифра это 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Все что больше — Числа.

http://ru.wikipedia.org/wiki/Цифр

А про разрядность да, не углядел.
Причём тут цифра? Выкладки то Ваши для пятизначного числа.
Разрядность не имеет значения.

Число разрядности n представимо полиномом вида
a*10n + b*10n-1 + c*10n-2 +… + y*101 + z
Перенесем первую цифру и запишем полученное число в виде полинома
b*10n + c*10n-1 + d*10n-2 +… + z*101 + a

Составим уравнение
2a*10n + 2b*10n-1 + 2c*10n-2 +… + 2y*101 + 2z = b*10n + c*10n-1 + d*10n-2 +… + z*101 + a

a(2*10n – 1) = b*10n-1 * 8 + c*10n-2 * 8 + d*10n-3 * 8 +… + z * 8

Выносим восьмерки

a(2*10n – 1) = 8( b*10n-1 + c*10n-2 + d*10n-3 +… + z)

a = 8 *(b*10n-1 + c*10n-2 + d*10n-3 +… + z) / (2*10n – 1)

И полученное число должно быть натуральным, от 0 до 9.
Число в знаменателе, очевидно, будет представлять собой единицу и n девяток.
Забудем на время про восьмерку, посмотрим на оставшуюся часть дроби. Степень знаменателя, как видно, больше степени числителя. Т.е. дробь правильная, ее значение лежит на интервале [0,.5). Получить целое число можно с помощью восьмерки (Кстати, оно должно быть меньше 4 ввиду правой границы интервала).
Что может дать нам девятку в конце числа? Умножение 7 на 7, 1 на 9, 9 на 1 или 3 на 3. То есть, частное (если нам удастся поделить знаменатель на числитель) будет оканчиваться на 1, 3, 7 или 9. Внимание,
вопрос: какое число, оканчивающееся на любую из этих цифр, будет делиться на 8 без остатка?
Никакое, так как 8 четное, а 1,3,7,9 нечетные, а значит и числа будут тоже нечетными)
Нечетные на четные не делятся.
Не понятно только, зачем нам нужна девятка в конце числа?

Можно пойти по-другому:

a*10n + b = 2*(b*10+a)
a = {0,2,4,6,8}
b — целое число
отсюда
b = (10n-2)*a/19

остается найти число 10n-2, которое делится на 19. И такие числа существуют(по крайней мере одно). Другое дело, что на бумаге я его найти не смогу =)
Да, насчет a={0,2,4,6,8}, я похож соврал, но картину это не портит.
UFO landed and left these words here
Суть задачи: найти число, которое, если взять последнюю цифру и переместить в начало будет в два раза меньше получившегося числа. То есть, abcde * 2 = bcdea. Разрядность не ограничена.

abcde * 2 = bcdea — первая цифра в конец.
abcde * 2 = eabcd — последняя в начало.
Написал програмку которая брутит. Запустил и жду…
Вот если кто то хочет довести до конца — вот код.

  1. public class Main {
  2.  
  3.     public static int digits(long number) {
  4.         int count = 0;
  5.         while (number != 0) {
  6.             number /= 10;
  7.             count++;
  8.         }
  9.         return count;
  10.     }
  11.  
  12.     public static boolean check(long number, boolean debug) {
  13.         if(debug)
  14.             System.out.println("Completed " + number + " numbers");
  15.  
  16.         long last = number % 10;
  17.         if(last % 10 == 0)
  18.             return false;
  19.         long res = number/10+last*(long)Math.pow(10, digits(number)-1);
  20.  
  21.         return number*2 == res;
  22.     }
  23.  
  24.     public static void main(String[] args) {
  25.         for(long i=0;i<Long.MAX_VALUE;i++) {
  26.             boolean c = check(i, i%10000000==0);
  27.             if(c) {
  28.                 System.out.println(i);
  29.                 break;
  30.             }
  31.  
  32.         }
  33.     }
  34. }
Решение на пхп:

<?php
$a = 2;
$source = array($a*2);
$modified = array($a);
$add = 0;
do
{
$newDigit = $source[0] * 2 + $add;
$add = 0;
if($newDigit > 9)
{
$newDigit = $newDigit % 10;
$add = 1;
}
array_unshift($source, $newDigit);
}
while(!check($source, $a));

echo implode('', $source);

function check($source, $a)
{
$modified = array_merge(array_slice($source, 1, count($source)), array($source[0]));

$add = 0;
for($i=count($modified)-1;$i>=0;$i--)
{
$d = $modified[$i] * 2 + $add;
$add = 0;
if($d > 9)
{
$d = $d % 10;
$add = 1;
}
if($d != $source[$i])
return false;
}
if($add == 0)
return true;
else
return false;
}
?>
С++-прогеры, напишите свое решение! жаба и пых очень медленные )
моё решение выше выполняется за доли секунды — это не брутфорс
Суть задачи: найти число, которое, если взять последнюю цифру и переместить в начало будет в два раза меньше получившегося числа. То есть, abcde * 2 = bcdea


Сказали одно, пример привели не тот=)
Если число в 2 раза меньше получившегося, то bcdea * 2 = abcde. Или, чтоб понятнее, abcde * 2 = eabcd

Кстати, если моя логика меня не подводит, задача вида abc… * 2 = bc...a не решается.
еще задачка:
найдите число, сумма цифр которого равна этому числу )
UFO landed and left these words here
105263157894736842
157894736842105263
210526315789473684
263157894736842105
315789473684210526
368421052631578947
421052631578947368
473684210526315789

Ударим мозгами по брутфорсу же!
В следующих числах по 36 цифр. Кто не будет думать, будет брутфорсить очень долго

Подсказка:
105263157894736842
157894736842105263
210526315789473684
263157894736842105
315789473684210526
368421052631578947
421052631578947368
473684210526315789
shaman4d.habrahabr.ru/blog/93370/#comment_2833220

101, 102,…, 1018 все имеют различные остатки от деления на 19, и дальше эта последовательность повторяется с периодом 18. В частности, остаток 2 имеют степени 1017, 1035 и т.д. Остается подобрать такое (четное) a, чтобы 10n < b < 10n-1 — 2,4,6,8:
105263157894736842
210526315789473684
315789473684210526
421052631578947368

Числа большей разрядности можно получить простым повторением этих:
105263157894736842105263157894736842105263157894736842 * 2 = 210526315789473684210526315789473684210526315789473684
a не обязательно чётное. Так правильнее: a = [2; 9]
ну тогда уже a = [0,4];
Когда а >= 5 при умножении на 2 количество разрядов у числа увеличится. А при нуле вполне себе может существовать решение.
Вы путаете задачи. Внимательней почитайте комментарии, автор допустил ошибку при написании топика.
То, что есть другая задача, я знаю. Очень много других задач. Но ведь обсуждение идет именно этой задачи, разве нет? И применительно к ней мое замечание тоже действительно.
Хотя если смотреть на комментарий galaxy, то я не прав, ведь он ведет речь о числах.
Просто проскочил суть в контексте общей задачи, где оперировали цифрами.
задачку эту решал еще в пятом или шестом классе на олимпиаде по математике, решил таки :) решение находится алгритмически просто :)
У меня вышло, что решения не может существовать.
если представить число так
(a*m + b) * 2= b*10 + a, где m число вида 10^x, где x натуральное число.
1. если a >= 5 при умножении на 2 количество разрядов поменяется.
2. a != 0, т.к. 2*b != 10*b
Значит a = [1, 2, 3, 4]

если перенести члены, то получается
a*(2m-1)/8 = b

2m-1 всегда будет вида 19, 199, 1999, а a меньше 8, тоесть целочисленное b невозможно.
Sign up to leave a comment.

Articles