Обработка больших целых чисел, чтобы решить задачу 196

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

Палиндромы

Символьная строка называется палиндромом, если она та же самая при чтении назад. Положительное целое число называется палиндромом, если его десятичное представление является палиндромом. Для примера 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

The 196-Problem

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

Проблема все еще открыта, и palindrome aficionados вложили много центральных процессоров лет в 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