Обработка больших Целых чисел, чтобы решить 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
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 проблемами

Делает алгоритм, оконечный для каждого 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