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

В этом примере показано, как работать с большими целыми числами и их десятичным представлением с помощью Symbolic Math 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
187
968
1837
9218
17347
91718
173437
907808
1716517
8872688
17735476
85189247
159487405
664272356
1317544822
3602001953
7193004016
13297007933
47267087164
93445163438
176881317877
955594506548
1801200002107
8813200023188
Finished in iteration 24

С 196 проблемами

Делает алгоритм, оконечный для каждого N?

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