초완전수

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

18개의 풀이가 있습니다. 1 / 2 Page

var arr = [];
var input = prompt("input: ")

for(var i=1; i<=input; i++){
  var sum = 0;
  for(var divisor=1; divisor<=i; divisor++){
    if(i%divisor == 0){
      sum += divisor;
    }
  }
  for(var k=1; k<=i; k++){
    if(i == (1+k*(sum-i-1))){
      arr.push({"n":i, "k":k})
    }
  }
}
console.log(arr)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
package coading02;
import java.lang.*;
import java.util.*;
public class Test01 {
    public static void main(String[] args) {

        Scanner robot = new Scanner(System.in);
        int num;
        System.out.print("입력 : ");
        num = robot.nextInt();

        int tmp = 0;

        for(int i = 1 ; i <= num ; i++){
            for(int j = 1 ; j < i ; j++){
                if(i%j == 0){
                    tmp+=j;
                }
            }
            //System.out.println("tmp = "+tmp);
            for(int k = 1 ; k < i ; k++){
                if(k*(tmp-1) == (i-1)){
                    System.out.println("("+i+","+k+")");
                    break;
                }
            }
            tmp = 0;
        }
        System.out.println("종료");
    }
}

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

public class numer_1 {

    public static void main(String[] args) {
        **int** num = 0;
        **Divisor** divisor = new Divisor();

        System.out.print("Input : ");
        **Scanner** scan = new Scanner(System.in);
        num = scan.nextInt();

        **for**(**int** i = 2; i < num; i++){
            **divisor.calc_divisor(i);**
            **divisor.determind(i);**
        }

    }

}


public class Divisor {

    **int** sum;
    public Divisor(){
        sum = 0;
    }

    public **void calc_divisor**(**int** num){
        **for**(int i = 2; i < num; i++){
            **if**(num % i == 0)
                sum += i;
        }
    }

    public **void determind**(**int** num){
        **int** k;
        **if**(sum == 0)
            **return;**
        **if**((num - 1) % (sum) == 0){
            **k = (num - 1) / (sum);**
            System.out.print("(" + num +"," + k +")");
        }
        sum = 0;
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def hyper_perfect_num(n):
    result=[]
    for i in range(1,n+1):
        for j in range(1,i):
            if j*(sum(x for x in range(1,i) if i%x==0)-1)+1==i:
                result+=[(i,j)]
    print(result)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

자바입니다.

public class Hyper_Perf_Nu {
    public static void calcPerfNu(int n) {
        int tmp = 0;
        String result = "";
        int sum = 0;
        for (int i = 1; i <= n; i++)
            if (n % i == 0) {
                sum += i;
            }

        for (int i = 1; i <= n; i++) {

            if (n == 1 + i * (sum - n - 1)) {
                tmp = i;
                result = "(" + n + "," + tmp + ")";
                System.out.println(result);
            }
        }

    }

    public static void prnPerfNu(int n) {
        for (int i = 1; i <= n; i++) {
            calcPerfNu(i);
        }
    }

    public static void main(String[] args) {
        prnPerfNu(1000);
    }

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

from math import *
from itertools import *

def primedp(p):
    dic = {}
    a = p
    for i in range(2, int(sqrt(p))+1):
        c = 0
        while a%i == 0:
            a = a//i
            c += 1
        dic[i]=c
    if a!= 1:
        dic[a] = 1
    dic = list(dic.items())
    for i in range(len(dic), 0, -1):
        if dic[i-1][1] == 0:
            del dic[i-1]
    dic = dict(dic)
    return dic

def divisors(n):
    case = primedp(n)
    def times(l):
        n=1
        for i in l:
            n *= i
        return n
    r = eval('list(map(times,product('+str([[y**k for k in range(0,case[y]+1)] for y in case.keys()])[1:-1]+')))')
    return r

do = lambda x: sum(divisors(x))

for i in range(2,int(input())+1):
    try:
        k = (i-1)/(do(i)-i-1)
        if int(k)==k:
            print((i,int(k)))
    except ZeroDivisionError:
        pass
입력:
1000
출력:
(6, 1)
(21, 2)
(28, 1)
(301, 6)
(325, 3)
(496, 1)
(697, 12)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
static final int INPUT = 1000;

    public static void main(String argv[]) throws Exception {



        for(int i = 2; i<=1000; i++){

            int sum = sumDivisor(i);

            if(sum !=0 && (i -1) % sum == 0){

                    System.out.println("("+i+","+i/sum +")" );

            }

        }

    }


    private static int sumDivisor(int val){


        int rtnVal = 0;
        for(int i = 1; i<= val ; i++){

            if(val%i == 0){

                rtnVal+=i;
            }

        }

        return rtnVal -1 - val;

    }

2017/01/18 14:20

lhc

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

def nombreHyperparfait(n: Int): Unit = {
    (1 to n).foreach(i => {
        val mv = mineralWater(i) - i - 1
        if (mv > 0 && i > 1) {
            val fd = (i - 1) / mv
            val fm = (i - 1) % mv
            if (fd > 0 && fm == 0) print("(" + i + "," + fd + ")")
        }
    })
}

def mineralWater(n: Int): Int = {
    (1 to n).filter(i => n % i == 0).sum
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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 = ' ')
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
// C++

// 양의 약수의 합을 구함..

inline int FuncD( int nValue )
{
    int nSum    = 0;

    int nTemp   = nValue;

    while( nTemp > 0 )
    {
        if( nValue  % nTemp == 0 )
        {
            nSum    += nTemp;
        }

        --nTemp;
    }

    return nSum;
}

// k = ( n - 1 ) / ( f( n ) - n - 1 )

inline int GetK( int nValue )
{
    int nDiv = ( FuncD( nValue ) - nValue - 1 );

    if( nDiv <= 0 )
    {
        return -1;
    }

    nValue  = ( nValue - 1 ) / nDiv;

    return nValue;
}

//n = 1 + k * ( f ( n ) - n - 1 )

inline int GetN( int nValue )
{
    return ( 1 + GetK( nValue ) * ( FuncD( nValue ) - nValue - 1 ) );
}

int main()
{
    int nValue  = 0;

    cin >> nValue;

    for( int x = 0 ; x <= nValue ; ++x )
    {
        if( x == GetN( x ) )
        {
            cout << x << "," << GetK( x ) << "\n";
        }
    }

    return 0;
}

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

풀이 작성

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

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


언어별 풀이 현황
전 체 x 18
java x 4
scala x 1
python x 7
javascript x 1
matlab x 1
cpp x 3
ruby x 1