초완전수

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

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

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

import java.util.Scanner;

/**
 * 자연수 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)
 */
public class ChoPerfectNum {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.print("Please insert Number? ");
        int iNum = sc.nextInt();

        for(int i=1; i<=iNum; i++) {
            for(int j=1; j<i ; j++){
                if(i==(1+j*(getPerfectNum(i)-i-1))){
                    System.out.println("ChoPerfect Number ========> (" + i + ","+j+")");
                }
            }
        }
    }

    // f(n)=(n의 양의 약수의 합) 처리
    public static int getPerfectNum(int iNum) {
        int iSum = 0;
        for(int i=1;i<iNum+1;i++){
            if(iNum % i == 0){
                iSum = iSum + i;
            }
        }
        return iSum;
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
n = 1 + k(f(n)-n-1)
n = 1 + ka
n-1 = ka
k = (n-1)/a

으로 정리될 수 있기 때문에 루프를 한번 돌면서 계산식에 맞아 떨어지는 것만 가져옵니다.

def find_k_supernum(max_n):
    supernums = []
    for n in range(1, max_n+1):
        divisors_sum = sum([x for x in range(1,n+1) if n % x == 0])
        a = (n - 1)
        b = (divisors_sum - n - 1)
        if b > 0 and a % b == 0:
            supernums.append('(%d, %d)' % (n,  a/b))
    return ' '.join(supernums)
print(find_k_supernum(1000))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
_ = [*(((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;
    }
}

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

풀이 작성

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

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


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