Matlab точность работы с большим числом - PullRequest
0 голосов
/ 28 декабря 2018

Вопрос возник у меня, когда я пытался решить Project Euler # 16.

Проблема гласит:

2 15 = 32768 и суммаиз его цифр 3 + 2 + 7 + 6 + 8 = 26.

Какова сумма цифр числа 2 1000 ?

Я пытался справиться с этим с MATLAB.Вот мой код:

function [sum] = power_digit_sum_p16(pow)
    sum = 0;
    n = 2 ^ pow;
    M = zeros(1,301);
    for i = 301 : -1 : 0
        a = floor(n / 10 ^ i);
        M(302 - i) = a;
        sum = sum + a;
        n = n - 10 ^ i * a;
    end
end

(где 301 обозначает 301 цифру 2 ^ 1000)

Когда я набрал pow_digit_sum_p16(1000), MATLAB вернул 1285, что неверно.

Затем я проверил номер, предоставленный MATLAB, который хранится в матрице M, когда узнал, что что-то не так.

Последняя цифра 2 ^ 1000 должна быть 6 вместо 2 (этоследует шаблону 2-4-8-6-2-4-8-6)! Я не понимаю, что здесь происходит с MATLAB, но я думаю, что проблема возникла из-за слишком большого числа, так как моя функция работает нормальнокогда pow мало.

Мой друг предоставил мне решение Python, и кажется, что Python хорошо справляется с большим числом.Ниже приведен код на Python:

x=2**1000
ans=0
while x>0:
    ans+=(x%10)
    x=x//10
print(ans)

Обновление: благодаря ответу OmG я немного изменил свой код:

function [sum] = power_digit_sum_p16(pow)
    sum = 0;
    n = 2 ^ pow;
    n = sym(n);                     % This line is new!
    M = zeros(1,301);
    for i = 301 : -1 : 0
        a = floor(n / (10 ^ i));
        M(302 - i) = a;
        sum = sum + a;
        n = n - (10 ^ i) * a;
    end
end

И я получил то, что ожидал.Обратите внимание, что для функции sym требуется набор инструментов Symbolic Math.

1 Ответ

0 голосов
/ 28 декабря 2018

Решением является использование символических инструментов.Например, чтобы найти истинное значение для оставшихся для 2^1000 более 10, вы можете сделать следующее:

x = sym('2^1000');
reminder = fix(double(mod(x,10)))

Ответ:

 reminder = 
 6

Для 100 и 1000 - это 67 и 376 соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...