초완전수

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

22개의 풀이가 있습니다. 1 / 3 Page

_ = [*(((lambda a: (print(i, (i-1)//a) if a and (i-1)%a == 0 else 0))(sum(j for j in range(1, i+1) if i%j == 0)-i-1)) for i in range(2, int(input('>>>'))+1))]

_ =는 없어도 무관. 콘솔 실행 시는 사용 권장.

파이썬 3.6.0 64

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
// 양의 약수의 합 출력 함수.
int myPrintFn(int num)
{
    int sum = 0;
    for (int i = 1; i < num+1; i++)
    {
        if (num%i == 0)
        {
            sum += i;
        }
    }
    return sum;
}


int main(void)
{
    int scannum = 0;
    printf("입력하는 값 이하의 초완전수를 구합니다. : ");
    scanf("%d", &scannum);

    for (int i = 2; i < scannum+1; i++)         //1은 해당x.
    {
        int result = myPrintFn(i) - i - 1;      //for문 내 반복계산을 피하기위함.
        for (int j = 0; j <= i; j++)
        {
            if ((double)j == (i - 1) / (double)result)
            {
                printf("(%d,%d)", i,j);
            }
        }
    }
    printf("\n");
    return 0;
}

c입니다. 조언부탁드립니다.

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

func main() {
    for i in 1...inputNumber {
        let divisor = divisorSumNum(num: Int(i))
        printPerfectNumber(n: Double(i), divisor: divisor)
    }
}

func divisorSumNum(num: Int) -> Double {
    var sum = 0
    let endNum = sqrt(Double(num))

    for i in 1...Int(endNum) {
        if (num % i) == 0{
            var tempNum = 0
            sum += i

            if endNum != Double(i) {
                tempNum = num / i
                sum += tempNum
            }
        }
    }   
    return Double(sum)
}

func printPerfectNumber(n : Double, divisor: Double) {
    if (divisor - n - 1) > 0 {
        let k = (n - 1) / (divisor - n - 1)
        if k == floor(k) {
            print(Int(n), Int(k))
        }
    }
}

main()

다듬고 다듬었지만... 이렇습니다.

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

MATLAB으로 짜보았습니다.

clear all
close all
clc

N=input('입력 : ');
for n=1:N

    % reset the value
    f_n__minus__n_1=0; % f(n)-n-1

    % accumulate the prime numbers
    for p=2:floor(n/2)
        if mod(n,p)==0
            f_n__minus__n_1=f_n__minus__n_1+p;
        end
    end

    % If n is a prime number, this number can be zero. As such, it should skip the loop.
    if f_n__minus__n_1==0 
        continue
    end

    % calculate k
    k=(n-1)/f_n__minus__n_1;

    % maybe... we are interested in only natural number k
    if floor(k)~=k
        continue
    end

    % display
    disp(['(' num2str(n) ',' num2str(k) ')']);
end
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

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

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


언어별 풀이 현황
전 체 x 22
python x 8
기 타 x 1
objectivec x 1
matlab x 2
javascript x 1
java x 4
scala x 1
cpp x 3
ruby x 1