Найти все числа, равные сумме факториала их цифр - PullRequest
0 голосов
/ 10 января 2019

Как найти все числа (например, 145 = 1! + 4! + 5! = 1 + 24 + 120 = 145.) которые равны сумме факториала их цифр по MATLAB?

Я хочу отрубить цифры, сложить факториал цифр и сравнить его с исходным числом. Если факториальное суммирование будет равно исходному числу, это число является одним из решений и должно быть сохранено. Я не могу написать свою идею. Как я могу ее написать? Это правда? Спасибо

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Основная причина, по которой я публикую этот ответ, заключается в том, что я не могу оставить использование eval в предыдущем ответе без достойной альтернативы

Вот небольшая функция, чтобы проверить это для любого заданного (целого) n:

isFact = @(n) n==sum(factorial(int2str(n)-'0'));

Пояснение:

  1. int2str(n)-'0': "отрубить цифры"
  2. sum(factorial(...)): «сложить факториал цифр вместе»
  3. n==...: «сравнить с исходным числом»

Теперь вы можете включить его в цикл, чтобы найти все числа от 1 до maxInt:

maxInt = 100000; % just for the example
solution = false(1,maxInt); % preallocating memory
for k = 1:maxInt
    solution(k) = isFact(k);
end
find(solution) % find all the TRUE indices

Результат:

ans =
           1           2         145       40585

Цикл выше был написан, чтобы быть простым. Если вы ищете дополнительную эффективность и гибкость (например, не проверяете все числа от 1 до maxInt и не проверяете массив в любой форме), вы можете изменить его на:

% generating a set of random numbers with no repetitions:
Vec2Check = unique(randi(1000,1,1000)); % you can change that to any array
for k = 1:numel(Vec2Check)
    if isFact(Vec2Check(k))
        Vec2Check(k) = Vec2Check(k)+0.1;
    end
end
solution = Vec2Check(Vec2Check>round(Vec2Check))-0.1

Добавление 0.1 служит «флагом», который отмечает числа, которые isFact возвращает для них true. Затем мы извлекаем их, сравнивая вектор с округленной версией.


Вы даже можете использовать однострочное решение:

solution = nonzeros(arrayfun(@(n) n.*(n==sum(factorial(int2str(n)-'0'))),Vec2Check))
0 голосов
/ 10 января 2019

Следующий фрагмент находит числа до 1000, удовлетворяющие этому условию.

numbers = [];
for i=1:1000
  number_char = int2str(i);
  sum = 0;
  for j=1:length(number_char)
   sum = sum+ factorial(eval(number_char(j)));
  end
  if (sum == i)
     numbers(end+1) = i;
  end
end
disp(numbers)

Это должно дать:

1  2  145 

Обратите внимание, что если (log10 (n) +1) * 9! меньше n, то нет числа, удовлетворяющего условию больше n.

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