Задания
Версия для печати и копирования в MS Word
Тип 5 № 75269
i

Ал­го­ритм по­лу­ча­ет на вход на­ту­раль­ное число N и стро­ит по нему новое число R сле­ду­ю­щим об­ра­зом.

1.  Стро­ит­ся тро­ич­ная за­пись числа N.

2.  В по­лу­чен­ной за­пи­си все нули за­ме­ня­ют­ся на двой­ки, все двой­ки  — на нули. Из по­лу­чен­но­го числа уда­ля­ют­ся ве­ду­щие нули.

3.  Ре­зуль­тат пе­ре­во­дит­ся в де­ся­тич­ную си­сте­му счис­ле­ния.

4.  Ре­зуль­та­том ра­бо­ты ал­го­рит­ма ста­но­вит­ся мо­дуль раз­но­сти ис­ход­но­го числа N и числа, по­лу­чен­но­го на преды­ду­щем шаге.

 

При­мер. Дано число N  =  35. Ал­го­ритм ра­бо­та­ет сле­ду­ю­щим об­ра­зом.

1.  Стро­им тро­ич­ную за­пись числа N: 3510  =  10223.

2.  За­ме­ня­ем цифры и уда­ля­ем ве­ду­щие нули: 1022 → 1200.

3.  Пе­ре­во­дим в де­ся­тич­ную си­сте­му: 12003  =  4510.

4.  Вы­чис­ля­ем мо­дуль раз­но­сти: |35 − 45|  =  10.

Ре­зуль­тат ра­бо­ты ал­го­рит­ма R  =  10.

При каком наи­мень­шем N в ре­зуль­та­те ра­бо­ты ал­го­рит­ма по­лу­чит­ся R  =  1 864 648.

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние за­да­чи на языке Python.

for N in range(1864648, 10**10):

s = ''

while N > 0:

s += str(N%3)

N //= 3

s = s[::-1]

R = s.replace('0','*').replace('2','0').replace('*','2')

if abs(int(s,3) - int(R,3)) == 1864648:

print(int(s,3))

break

 

Ответ: 3323808.

 

 

При­ведём про­грам­му Сер­гея Донец на PascalABC.NET:

При малых N раз­ность R = |M - N| также мала (как в при­ме­ре с N = 35 → R = 10).

M по­лу­ча­ет­ся за­ме­ной цифр в тро­ич­ной за­пи­си N, по­это­му M и N имеют со­по­ста­ви­мый по­ря­док ве­ли­чи­ны.

R растёт про­пор­ци­о­наль­но N, но не­ли­ней­но из-за за­ме­ны цифр в тро­ич­ной си­сте­ме.

Если N∼103 то R∼103.

Если N∼106 то R∼106.

Сле­до­ва­тель­но, R=∣M−N∣ также имеет по­ря­док, близ­кий к N.

При за­ме­не всех 0 на 2 в тро­ич­ной за­пи­си N, число M может уве­ли­чить­ся мак­си­мум в 2 раза

если N = R = 1864648 div 2, то N = 932123 M = 661998 R = 270326 под­твер­жда­ет­ся про­пор­ци­о­наль­ность ∼103

чтобы не вы­счи­ты­вать оп­ти­маль­ное на­ча­ло N при­мем N = R = 1864648 и для него вы­счи­та­ем раз­ность:

N = 1864648. по­лу­чим M = 2918320 R = 1053672 (мень­ше тре­бу­е­мо­го почти в 2 раза), зна­чит

N > 1864648. также под­твер­жда­ет­ся про­пор­ци­о­наль­ность ∼106

Если N<1864648, то M (по­лу­чен­ное за­ме­ной цифр) не может быть боль­ше N+1864648, так как за­ме­на цифр в тро­ич­ной си­сте­ме не при­во­дит к та­ко­му скач­ку. Сле­до­ва­тель­но, R=∣M−N∣ не может до­стичь 1864648 при N<1864648.

Пе­ре­бор можно на­чи­нать и с N = 1, но оп­ти­маль­нее  — с N = R = 1864648, так как при N<1864648 раз­ность за­ве­до­мо мень­ше це­ле­во­го зна­че­ния.

мы и так уже сэко­но­ми­ли диа­па­зон 1..1864648. На­чи­на­ем пе­ре­бор с N=1864648.

Обос­но­ва­ние ниж­ней гра­ни­цы по­ис­ка

Если N<1864648, то R за­ве­до­мо мень­ше це­ле­во­го зна­че­ния, так как R≤N<1864648.

Сле­до­ва­тель­но, пе­ре­бор можно на­чи­нать с N=1864648 (это эко­но­мит диа­па­зон 1..1864648).

Оп­ти­ми­за­ция верх­ней гра­ни­цы

Верх­няя гра­ни­ца: N≤2×1864648 (так как M≤2N, и R=M−N≤N).

Ито­го­вый диа­па­зон пе­ре­бо­ра: N∈[1864648, 1864648 * 2].}

 

uses School;

begin

var start := 1864648;

var koend := 1864648 * 2;

var minN := MaxInt; // Ини­ци­а­ли­за­ция мак­си­маль­ным зна­че­ни­ем

for var n := start to koend do

begin

var T := ToBase(n, 3); // N в тро­ич­ной си­сте­ме

T := T.Translate('02', '20');// За­ме­на 0→2, 2→0

var M := dec(t, 3); // M = пре­об­ра­зо­ван­ное число

var R := abs(M - N); // R = |M - N|

if R = 1864648 then begin

minN := N < minN ? N : minN;// Об­нов­ля­ем ми­ни­маль­ное N

//Println(N, M, R); // Вывод для от­лад­ки = в окон­ча­тель­ном ва­ри­ан­те за­ко­мен­ти­ру­ем

end;

end;

Println(minN); // Ми­ни­маль­ное N, да­ю­щее R = 1864648

end.


Аналоги к заданию № 75242: 75269 Все