python совершенные квадратные свободные числа и их множители

Я хочу получить числа, которые не являются идеальным квадратом и являются факторами входного числа. Проблема, с которой я сталкиваюсь здесь, заключается в том, что мы вводим 72, поэтому 36 - это идеальный квадрат, а 12 - нет, но в множителях 12 4 - это идеальный квадрат, поэтому 12 нельзя сосчитать сейчас. Я хочу получить числа, которые свободны от идеального квадрата, а также свободны от идеальных квадратов, поэтому в 72 только 2,3 и 6 являются числом без идеального квадрата.

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

def is_square(apositiveint):
    x = apositiveint // 2
    seen = set([x])
    while x * x != apositiveint:
        x = (x + (apositiveint // x)) // 2
        if x in seen:
            return False
        seen.add(x)
    return True


def print_factors(x):

    _list = []
    _list_1 = []
    _list_2 = []

    print("The factors of", x, "are:")
    for i in range(2, x + 1):
        if x % i == 0:
            if is_square(i) == False:
                _list.append(i)
            else:
                _list_1.append(i)
    return _list


num = int(input("Enter the number"))

_list_1 = []

_list_1 = print_factors(num)

number = []

for x in range(0, len(_list_1)):
    number = print_factors(_list_1[x])
    print(number)

вход

72

выход

Множители 72: Множители 2: [2] Множители 3: [3] Множители 6: [2, 3, 6] Множители 8: [2, 8] Множители числа 12: [2, 3, 6, 12] Множители числа 18: [2, 3, 6, 18] Множители числа 24: [2, 3, 6, 8, 12, 24] Множители числа 72: [2, 3, 6, 8, 12, 18, 24, 72]


person Bhushan Patil    schedule 09.08.2018    source источник


Ответы (2)


Эту же проблему можно решить по-другому:

  1. Напишите функцию, которая вычисляет множители t=числа.factors(x)

  2. Напишите еще одну функцию, которая определяет, являются ли число или его множители полными квадратами: perfc_sqr(x)

  3. Наконец, напишите функцию, которая возвращает множители без идеальных квадратов:

    import numpy as np
    def factors(x):
        nums =  np.arange(2,x+1)
        return nums[x % nums == 0]
    
    def perfc_sqr(x):
        pnum = np.sqrt(factors(x))[1:]
        return any(pnum== np.array(pnum,dtype="i"))
    
    def perfect_square_free(x):   
        return [i for i in factors(x) if not perfc_sqr(i)]
    perfect_square_free(72)
    [2, 3, 6]
    
person Onyambu    schedule 09.08.2018
comment
вау, большое спасибо, это так много маленького кода, я не знаю, что такое numpy, поэтому я понятия не имел, что его можно сделать таким маленьким - person Bhushan Patil; 09.08.2018

Я изменил свой код, используя sqrt(apositiveint).is_integer(), что упростило мою жизнь, чтобы найти, является ли его идеальный квадрат или нет, затем я изменил полную функцию, чтобы, если число четное, его сначала сделали нечетным, а затем проверили его квадратный корень или нет, теперь единственная проблема 2 нет в списке, но счет правильный

def is_square(apositiveint):
    if apositiveint % 2 == 0:
        apositiveint = apositiveint / 2
    if apositiveint % 2 == 0:
        return True
    return sqrt(apositiveint).is_integer()

Я добавил модифицированную эту функцию и поместил ее в программу

from math import sqrt

def is_square(apositiveint):
    if apositiveint % 2 == 0:
        apositiveint = apositiveint / 2
    if apositiveint % 2 == 0:
        return True
    return sqrt(apositiveint).is_integer()

def print_factors(x):

    _list = []
    count = 0

    print("The factors of", x, "are:")
    for i in range(1, x + 1):
        if x % i == 0:
            if is_square(i) == False:
                _list.append(i)
                count += 1
    print(count + 1)
    return _list


num = int(input("Enter the number"))

_list_1 = []

_list_1 = print_factors(num)

number = []

for x in range(0, len(_list_1)):
    number = print_factors(_list_1[x])
    print(number)
person Bhushan Patil    schedule 09.08.2018