1. Концепция
Во -первых, давайте поймем, что такое идеальное число?
Описание задачи: Если естественное число, сумма всех его истинных факторов (то есть делители, кроме себя), точно равна ему, и это число называется полным числом. Сокращено как «законченный номер»
Например,
6 = 1+2+3
28 = 1+2+4+7+14
496 = 1+2+4+8+16+31+62+124+248
8128 = 1+2+4+8+16+32+64+127+254+508+1016+2032+4064
Согласно определению готового числа, не так сложно решить число, используя программу. Во -первых, решите все истинные факторы этого числа, а затем добавьте их, чтобы определить, равно ли он ему. Однако, когда это число очень мало, нет проблем. Как только это число превышает определенное значение, возникает проблема, и эффективность выполнения программы будет оскорблена.
Когда мы оптимизируем логику программ алгоритма, мы часто рассматриваем вопрос: как эффективно использовать характеристики компьютеров? Есть ли много повторной бесполезной работы в алгоритме, которую он определяет? Рассмотрив эту проблему по этой линии мышления, мы скоро получим другое решение.
2. Описание
2.1 Анализ
Здесь мы легко думаем о факторе разложения, который мы упоминали ранее? Да, при решении идеальных чисел мы будем использовать факторы разложения. Вообще говоря, решение идеального числа пройдет три шага:
1. Найдите определенное количество основных чисел
2. Используйте таблицу основных номеров, чтобы найти факторизацию указанного числа
3. Используйте факторизацию, чтобы найти все истинные факторы и проверить, является ли это идеальным числом
2.2 Трудности
После первого взгляда нет проблем с первым и вторым шагом. Мы обсудили это в двух предыдущих статьях. Студенты, которые не ясно об этом, могут проверить это.
Ключевой момент - на третьем шаге, как найти сумму истинного фактора? Метод очень прост. Сначала вы должны знать, что добавление всех истинных факторов (студенты, которые не знают концепции истинных факторов, идите и посмотрите) и добавить, что само число будет вдвое больше (некоторые студенты не знают, но они должны знать это сейчас, верно?), Например,:
2 * 28 = 1 + 2 + 4 + 7 + 14 + 28
Фактически, это уравнение может быть преобразовано в: (ошибка ввода кода, я использовал скриншоты)
Обнаруженный? 2 и 7 оба факторизованы, так что есть упрощение программы?
2.3 Заключение
Требуется только факторизация, и вы можете использовать цикл, чтобы найти значение после уравнения, и разделить значение на 2, чтобы быть истинным фактором; Когда вы сначала посмотрите на уравнение, вы можете подумать об использовании формулы серии уравнений для его решения, но вы будете использовать работу питания. Вы можете рассчитать значение после уравнения одновременно при чтении массива факторизации.
3. код
импортировать java.util.arraylist; // Решить идеальное число публичного класса Perfectnumber {// пройти значение и решить, по крайней мере, сколько идеальных чисел публично статические int [] меньше (int number) {int [] primes = prime.findprimes (number); ArrayList List = new ArrayList (); for (int i = 1; i <= number; i ++) {int [] факторы = фактор (простые числа, i); if (i == fsum (факторы)) list.add (новое целое число (i)); } int [] p = new int [list.size ()]; Object [] objs = list.toarray (); for (int i = 0; i <p.length; i ++) {p [i] = ((Integer) objs [i]). intvalue (); } return p; } // Разместите фактор частного статического фактора int [] (int [] primes, int number) {int [] frecord = new int [number]; int k = 0; for (int i = 0; math.pow (primes [i], 2) <= number;) {if (число % primes [i] == 0) {frecord [k] = primes [i]; K ++; номер /= простые [i]; } else i ++; } frecord [k] = number; вернуть Фрекорд; } // Фактор sum private static int fsum (int [] farr) {int i, r, s, q; i = 0; r = 1; s = 1; Q = 1; while (i <farr.length) {do {r *= farr [i]; q += r; i ++; } while (i <farr.length - 1 && farr [i -1] == farr [i]); s *= q; r = 1; Q = 1; } return S / 2; } public static void main (string [] args) {int [] pn = perfectnumber.lessthan (1000); for (int i = 0; i <pn.length; i ++) {System.out.print (pn [i]+""); } System.out.println (); }}Суммировать
Выше приведенное дело об анализе идеального численного кода в этой статье, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это!