초완전수

자연수 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)

> 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
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

5개의 풀이가 있습니다.


N = int(input())
for n in range(2,N+1):
    div = 0; 

    for i in range(1,n+1): #약수의 합
        if n % i  == 0:
            div+=i

    if div - n - 1 != 0:
        k = (n-1) / (div - n - 1)
        if int(k) == k:
            print('({},{})'.format(n,int(k)))
    else:
        continue


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def fnat(a):
    sum=0
    for i in range(1,a+1):
        if a%i :pass
        else:
            sum=sum+i
    return sum
N=input("number=")
for i in range(2,int(N)+1):
    j=fnat(i)-i-1
    if j>0:
        if (i-1)%j: pass
        else:
            print("(",i,",",int((i-1)/j),")" , end=" ")
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def f(N):
    sum = 0
    for i in range(1,N+1):
        if N%i == 0:
            sum +=i
    return  sum

def A(N):
    for i in range(2,N+1):
        try:
            t = (i - 1) % (f(i) - i - 1)
        except:
            continue
        k = (i - 1) / (f(i) - i - 1)
        if t == 0:
            print('(', i, ', ', k, ')')

A(1000)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
n=int(input("input:"))
for nn in range(1,n):
    fn=sum(x for x in range(1,nn+1) if nn%x==0)
    o=((nn,k) for i,k in enumerate(range(1,nn)) if nn==(1+k*(fn-nn-1)))
    for ii in o:print(ii, end="")

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

def f(n):
    sum = 0
    for k in range(1,N+1):
        if n%k == 0:
            sum = sum + k
    return sum

for i in range(3,N+1):
    if (f(i)-i-1) != 0:
        if (i-1)%(f(i) - i - 1) == 0:
            k = (i-1)/(f(i) - i - 1)
            print('(%d, %d)' % (i, k), end = ' ')
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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


언어별 풀이 현황
전 체 x 12
java x 1
scala x 1
python x 5
matlab x 1
cpp x 3
ruby x 1