Обнаружение, если целое число может быть записано как умножение данных целых чисел

У меня есть ряд, данный целые числа:

A[] = { 2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 30, 40, 50, 100, 500 }
  1. Я хочу проверить если данное целое число T может быть записан как несколько числа в A[]; РАЗЪЯСНЕНИЕ РЕДАКТИРОВАНИЯ: любое число в [] может использоваться. Если используется может использоваться только в один раз. EX 60 является допустимым T.60=30*2. AlSO 90 допустим. 90=3*5*6

  2. Проверьте, какие числа могут сформировать то целое число T.

  3. Также возвратите 2 самых близких целых числа данному T (который может быть записан тот путь), если число T не может быть записан как несколько из этого числа.

Части 2 и 3, я думаю, что могу разобраться мой собственный, если кто-то помогает мне с частью 1.

Я знаю, что это - алгоритмический вопрос или даже математический, но если кто-либо может помочь, сделайте.

НЕ ДОМАШНЯЯ РАБОТА. СМ. КОММЕНТАРИЙ НИЖЕ.

#

РЕШЕНИЕ. TY ОЧЕНЬ ДЛЯ ВСЕГО ответа Ответов 1 особенно (но автор принимают решение удалить его и я не знаю действительно почему, так как это было корректно.) автор Ty (не помнят Ваше имя.)

#

Код решения со скручиванием (Алгоритм автора, используемый многократно один множитель. Этот множитель использования только в 1 раз)

int oldT = 0;
        HashMap<Integer, Boolean> used = new HashMap<Integer, Boolean>();
        while (T != 1 && T != -1) {
            oldT = T;
            for (int multiple : A) {
                if (!used.containsKey(multiple)) {
                    if (T % multiple == 0) {
                        T = T / multiple;
                        used.put(multiple, true); 
                    }
                }
            }
            if (oldT == T)
                return false;
        }
        return true;
5
задан weakwire 21 June 2010 в 03:31
поделиться

2 ответа

Если T не очень большое (скажем, <10 ^ 7), это прямой DP.

a[1] = true; // means that number '1' can be achieved with no multipliers
for (every multiplier x) {
   for (int i = T; i > 0; --i) {
      if (a[i] and (i * x <= T)) {
          // if 'i' can be achieved and 'x' is a valid multiplier,
          // then 'i * x' can be achieved too
          a[i * x] = true;
      }
   }
}

Предполагается, что каждый множитель можно использовать только один раз.
Теперь вы можете найти разложение T, если у вас есть другой массив b [i], в котором хранится, какой множитель использовался для достижения i.

Если у вас мало времени, есть много онлайн-контента, чтобы познакомиться с динамическим программированием. Это должно дать вам представление о том, как подходить к таким проблемам. Например, этот кажется неплохим
http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg

3
ответ дан 15 December 2019 в 00:50
поделиться

Я не совсем понимаю, о чем вы спрашиваете.

Если пользователь может выбрать n*(одно из этих чисел), то обратите внимание, что у вас есть простые числа 2, 3, 5 и 7, так что если ваше число делится на 2, 3, 5 или 7, то разделите его, и тогда у вас будет n*(это число).

Если вам нужно умножить числа друг на друга, но вы можете сделать это несколько раз, то снова обратите внимание на то, что все ваши числа делятся на 2, 3, 5 и 7. Проверьте, делится ли число только на них (делите каждое из них до тех пор, пока не сможете больше делить, затем посмотрите, осталась ли 1) и посчитайте, сколько раз вы делили на каждое из них.

Если вам нужно умножить числа друг на друга без замены, то снова найдите простую факторизацию и удалите из списка то число, которое делает присутствующие силы наиболее четными. Если вам удастся удалить все кратные числа, то вы закончили.

Во всех случаях, кроме последнего, число, на которое можно сделать ставку, очень плотное, так что вы можете найти ближайшее, просто поднявшись или опустившись и проверив еще раз. В последнем случае поиск чего-то близкого может быть довольно сложным; вы можете просто составить таблицу возможных (низких) ставок и предложить что-то из нее, предполагая, что пользователи не собираются ставить 2*3*4*5*6*7*8*10*15*....

1
ответ дан 15 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: