초완전수

자연수 n이 있다. f(n)=(n의 양의 약수의 합)이라고고 하자. 자연수 n이 어떤 k에 대하여 등식 n = 1 + k(f(n)-n-1)을 만족했을 때, n을 k-초완전수라고 부른다. n이 완전수라는 것은 n이 1-초완전수라는 것이라는 명제와 동치이다. 예를 들어, 21은 2-초완전수이고 301은 6-초완전수이다. 자연수 N을 입력받고 N 이하의 k-초완전수와 그때의 k를 순서쌍으로 출력하는 프로그램을 작성하라.

<예시> 1. 입력 1000 2. 출력 (6,1) (21,2) (28,1) (301,6) (325,3) (496,1) (697,12)

2016/12/29 05:21

박 시우

> 1. 입력 1000 2. 출력 (6,1) (21,2) (28,1) (301,6) (325,3) (496,1) (697,12) 죄송하지만 위에 예시 입력값100을 넣을때 나오는 ,21, 301은 완전수가 아닌거같아요 다시 확인부탁드려요 - Daniel, 2016/12/29 16:07 M D
100을 넣었는데 왜 301이 나오죠? 혹시 입력으로 1000을 넣었을 때를 말씀하시는건가요? 그렇다면 21은 2-초완전수이고, 301은 6-완전수가 맞을텐데요. 실수로 완전수와 초완전수를 헷갈리신게 아닐까요? 보충설명은 아래와 같습니다. A = {x | x는 21의 양의 약수} = {1, 3, 7, 21} B = {x | x는 301의 양의 약수} = {1, 7, 43, 301} 21 = 1+ 2 * (1 + 3 + 7 + 21 - 21 - 1) = 1 + 2 * 10 301 = 1 + 6 * (1 + 7 + 43 + 301 - 301 - 1) = 1 + 6 * 50 - 박 시우, 2016/12/29 20:18 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

34개의 풀이가 있습니다. 1 / 4 Page

# 약수의 합을 구하는 함수
def f(n) :

    result = 0
    for i in range(1, n + 1) :

        if n % i == 0 :
            result += i
        else :
            pass

    return result

# 완전수와 k의 쌍을 튜플로 출력하는 함수
def perfectNum(n) :

    k = 1
    while True :

        if n == 1 + k * (f(n) - n - 1) :
            return n, k

        elif k == n :
            break

        else :
            k += 1

    return None

#최종 프로그램
N = int(input())

for i in range(1, N + 1) :

    if perfectNum(i) == None :
        pass

    else :
        print(perfectNum(i), end = " ")

2017/08/20 15:18

DARK4Hoon

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def super_num(N):

    list_ans = []
    for n in range(2,N+1):
        list_a = []
        for i in range(1,n+1):
            if n%i == 0:
                list_a.append(i)
        if list_a == [1,n]:
            continue
        fn = sum(list_a)
        k = (n-1) / (fn -n-1)
        if k.is_integer() == True:
            list_ans.append([n,int(k)])
    print(list_ans)

super_num(1000)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def k_hyperperfect_number(N):
    list = []
    for n in range(3, N+1):
        factorsum = sum([x for x in range(2, n) if n % x is 0])  # 1, n 제외 약수합
        if factorsum is 0:
            continue

        (k, r) = divmod(n-1, factorsum)
        if r is 0:
            list.append((n, k))

    return list

print(k_hyperperfect_number(1000))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

javascript

var aliquotSum = n => Array.from(Array(n), (v, i) => i + 1)
                           .reduce((a, b) => a + (n % b === 0 ? b : 0), 0);                           

var hyperperfect = n => {
    var factor = aliquotSum(n) - n - 1;
    var k = 0;
    if (factor !== 0 && Number.isInteger(k = (n - 1) / factor)) {
        return [n, k];
    }
};

var findhp = n => Array.from(Array(n - 1), (v, i) => i + 2)
                       .map(hyperperfect)
                       .forEach(v => v && console.log(`(${v[0]}, ${v[1]})`));

findhp(1000);
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def MinMul(n):
    result = []
    for i in range(1,n+1):
        if n%i == 0:
            result.append(i)

    return sum(result)


def K(n):
    k = 0
    remk = 0
    if (MinMul(n)-n-1) == 0:
        pass
    else:
        k = ((n-1) / (MinMul(n)-n-1))
        remk = ((n-1) % (MinMul(n)-n-1))

    return (k, remk)




n = int(input("input : "))
for i in range(3,n+1):
    if K(i)[1] == 0 and K(i)[0] != 0:
        print ("(%d,%d)" %(i,int(K(i)[0])))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def divisor(n):
    l = []; i = 2
    while i*i <= n:
        if n % i == 0:
            l.append(i)
            l.append(int(n/i))
        i += 1
    l = list(set(l))
    return l

def hyperperfect(n):
    l = []
    for i in range(1,n+1):
        if sum(divisor(i)) != 0:
            a = sum(divisor(i))
            if (i-1) % a == 0: l.append([i,int((i-1) / a)])

    return l
hyperperfect(10000)
'''
[[6, 1],
 [21, 2],
 [28, 1],
 [301, 6],
 [325, 3],
 [496, 1],
 [697, 12],
 [1333, 18],
 [1909, 18],
 [2041, 12],
 [2133, 2],
 [3901, 30],
 [8128, 1]]
'''
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

import sys sys.path.append("C:/") import time import faliquot

def eperfect(N):

start_time = time.time()
List2 = []
temp = 0
for n in range(N):
    n = n + 1
    if (n % 2) == 0 and n > 2:
        x = n / 2
        temp = sum(faliquot.aliquot(x,2))
        if (temp - n - 1) != 0 : 
            k = (n-1) / (temp-n-1) 
        else:
            continue
        if (k % 1) == 0:
            List2.append((n,int(k)))

    elif (n > 3) and not(n % 2 == 0) :
        x = n / 3
        temp = sum(faliquot.aliquot(x,3))
        if (temp - n - 1) != 0 : 
            k = (n-1) / (temp-n-1)
        else:
            continue
        if (k % 1) == 0:
            List2.append((n,int(k)))

end_time = time.time()          
return List2, end_time - start_time

def aliquot(n, t) :

List1 = []
temp = 0
x =int(n)
for i in range(x):

    i = i + 1
    print("i=%s" %i)
    temp = ( t*n )% i
    print("temp=%s" %temp)

    if (temp == 0):                            
        List1.append(i)
        print("i=%s" %i)
List1.append(n*t)
print(List1)            
return List1
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

아래와 같이 평이한 수준에서 풀었습니다. 파이썬 3.6.1입니다.

def f(n):
    s, k, l = 0, 2, n ** 0.5
    while k < l:
        if n % k is 0:
            s += k + (n // k)
        k += 1
    if k * k == n:
        s += k
    return s

def do():
    n = int(input())
    result = []
    if n < 6:
        return result
    for i in range(6, n+1):
        k, j = 1, f(i)
        if j > 0:
            while i > j * k:
                if j * k + 1 == i:
                    result.append((i, k))
                    break
                k += 1
    return result

print(", ".join(str(x) for x in do()))

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Python 3.4.2 범위 입력받아 초완전수 튜플 리스트로 출력하기 한줄로 작성하고 싶었으나 실행속도를 올리기위해서 4줄로

약수합찾기의 실행속도를 올릴려면 max sqrt(num) 로 하면 반복회수 반으로 줄일 수 있고, range(2,ran+1)로 약수가 있는 2부터 시작하면 range(0), range(1) 을 안할 수 있으므로 약간 더 줄이고

from functools import reduce
from math import sqrt

def factors_sum_wo_1_self(num): # 1과 자기자신을 제외한 약수의 합 함수
    return sum(reduce(list.__add__, ([i, num // i] for i in range(1, int(sqrt(num))+1) if num % i == 0))[2:])

ran = int(input("Enter range: ")) # 범위입력
print([(n, int((n-1)/factors_sum_wo_1_self(n))) for n in range(2, ran+1) if factors_sum_wo_1_self(n) != 0 and (n-1)%factors_sum_wo_1_self(n) == 0]) # 결과는 튜플 리스트

실행결과

>>> ran = int(input("Enter range: "))
Enter range: 1000
>>> print([(n, int((n-1)/factors_sum_wo_1_self(n)))for n in range(2, ran+1) if factors_sum_wo_1_self(n) != 0 and (n-1)%factors_sum_wo_1_self(n) == 0])
[(6, 1), (21, 2), (28, 1), (301, 6), (325, 3), (496, 1), (697, 12)]
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 3입니다

print('N이하의 k-초완전수를 출력합니다.')
int_N = input("N을 입력하세요 : ")

string = ''

def divisor_sum(x):
    dsum = 0
    for i in range(1, x+1):
        if x%i == 0:
            dsum += i
    return dsum

for i in range(1, int(int_N) +1):
    for k in range(1, i):
        if i == 1 + k * (divisor_sum(i) - i - 1):
            string += str((i,k)) + ''

print(string)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 34
python x 17
javascript x 2
기 타 x 2
java x 5
objectivec x 1
matlab x 2
scala x 1
cpp x 3
ruby x 1