exponenta event banner

Обработка больших целых чисел для решения проблемы 196

В этом примере показано, как работать с большими целыми числами и их десятичным представлением с помощью символьного математического Toolbox™.

Палиндромы

Строка символов называется палиндромом, если она одинакова при обратном чтении. Положительное целое число называется палиндромом, если его десятичное представление является палиндромом. Например, 191, 313 и 5885 все являются палиндромами.

Рассмотрим следующий алгоритм

  • Начните с любого положительного целого числа N и добавьте его в зеркальное изображение.

  • Повторяйте этот шаг с полученным числом, пока не получите палиндром.

Например, пусть N = 89; тогда первые 3 итерации дают ...

89+98=187

187+781=968

968+869=1837

в конце концов, после 24 итераций вы прибудете в 8813200023188 палиндрома.

N = sym(89);
for k=0:100
    s1 = char(N);
    s2 = fliplr(s1);
    if strcmp(s1, s2)
       disp(['Finished in iteration ' num2str(k)]) 
       break
    end    
    N = N + sym(s2);
    disp(N)
end
187sym(187)
968sym(968)
1837sym(1837)
9218sym(9218)
17347sym(17347)
91718sym(91718)
173437sym(173437)
907808sym(907808)
1716517sym(1716517)
8872688sym(8872688)
17735476sym(17735476)
85189247sym(85189247)
159487405sym(159487405)
664272356sym(664272356)
1317544822sym(1317544822)
3602001953sym(3602001953)
7193004016sym('7193004016')
13297007933sym('13297007933')
47267087164sym('47267087164')
93445163438sym('93445163438')
176881317877sym('176881317877')
955594506548sym('955594506548')
1801200002107sym('1801200002107')
8813200023188sym('8813200023188')
Finished in iteration 24

В 196-Problem

Алгоритм завершается для каждого N?

Проблема все еще открыта, и palindrome aficionados вложили много лет CPU в дело N = 196, которое дало проблеме свое название. Для того, чтобы играть с этой проблемой в MATLAB™, символические целые числа полезны, потому что их размер неограничен. Используйте функциюsym для преобразования строк десятичных цифр в символьные целые числа, и char (не num2str !) для обратного преобразования.

Расследование знаменитого дела N = 196 производит поистине огромные цифры. Чтобы узнать, сколько десятичных цифр имеет целое число, просто используйтеlog10 :

N = sym(196);
for k=0:1000
    s1 = char(N);
    s2 = fliplr(s1);
    N = N + sym(s2);
end
disp(['Number of digits after ' num2str(k) ' iterations: ' char(ceil(log10(N)))]);
Number of digits after 1000 iterations: 411