"BOJ 4673 셀프 넘버"의 두 판 사이의 차이

 
(사용자 3명의 중간 판 12개는 보이지 않습니다)
1번째 줄: 1번째 줄:
[[분류:BOJ 5단계|1]]
==개요==
==개요==
* {{BOJ|4673}}
[[분류:BOJ]]
;{{PAGENAME}}
* 자연수 n에 대해 d(n)의 값을 구하는 함수를 정의해 문제를 해결해봅니다
* 자연수 n에 대해 d(n)의 값을 구하는 함수를 정의해 문제를 해결해봅니다
* 알고리즘 분류: 에라토스테네스의 체, 입문용
* 알고리즘 분류: 에라토스테네스의 체, 입문용
==Bash==
동작은 하지만 성능 문제가 있음.
<syntaxhighlight lang='bash'>
LANG=C
SELF_NUMBERS=""
for i in `seq 1 10000`
do
        if [ ! `echo "$SELF_NUMBERS" | grep -cP " ${i} "` -ne 0 ]; then
                echo $i
        fi
        k=`echo $i | perl -pe 's/(\d)/$1 + /g'`
        i=`expr $i + ${k}0`
        SELF_NUMBERS="${SELF_NUMBERS} ${i} "
done
</syntaxhighlight>
==C++==
<syntaxhighlight lang='cpp'>
#include <iostream>
using namespace std;
#define SIZE 10000
int main() {
    int d, temp;
    bool a[SIZE+1]={};
    for(int i=1;i<=SIZE;i++) {
    temp=i;
    d=i;
        while(temp){
        d += temp%10;
        temp /= 10;
    }
    if(d<=SIZE) a[d]=true;
    }
    for(int i=1;i<=SIZE;i++) {
    if( !a[i] ) printf("%d\n", i);
    }
}
</syntaxhighlight>
<syntaxhighlight lang='cpp'>
#include <iostream>
using namespace std;
#define SIZE 10000
bool a[SIZE+1]={};
int d(int n) {
int temp = n;
int res = n;
    while(temp){
    res += temp%10;
    temp /= 10;
}
return res;
}
int main() {
    int temp;
    for(int i=1;i<=SIZE;i++) {
    if( !a[i] ) printf("%d\n", i);
    temp = d(i);
    if( temp<=SIZE ) a[temp] = true;
    }
}
</syntaxhighlight>


==Java==
==Java==
<source lang='Java'>
<syntaxhighlight lang='Java'>
public class Main {
public class Main {
     private static final int SIZE = 10000;
     private static final int SIZE = 10000;
27번째 줄: 90번째 줄:
     }
     }
}
}
</source>
</syntaxhighlight>
 
==Perl==
<syntaxhighlight lang='perl'>
use List::Util qw(sum);
@self_numbers = ();
for $i (1..10000) {
    print "$i\n" unless ($self_numbers[$i]);
    $v=$i + sum(split //, $i);
    $self_numbers[$v]=1;
}
</syntaxhighlight>


==PHP==
==PHP==
<source lang='PHP'>
<syntaxhighlight lang='PHP'>
<?php
<?php
function d($n) { return $n + array_sum(str_split($n)); }
function d($n) { return $n + array_sum(str_split($n)); }
38번째 줄: 112번째 줄:
     $self_numbers[d($i)] = 1;
     $self_numbers[d($i)] = 1;
}
}
</source>
</syntaxhighlight>
 
==Python==
<syntaxhighlight lang='Python'>
def d(n):
    return n + sum(map(int,list(str(n))))
self_numbers = {}
for i in range(1,10001):
    if i not in self_numbers:
        print( i )
    self_numbers[d(i)] = 1
</syntaxhighlight>


==같이 보기==
==같이 보기==
44번째 줄: 129번째 줄:
* [[에라토스테네스의 체]]
* [[에라토스테네스의 체]]
* [[함수 str_split()]]
* [[함수 str_split()]]
* [[함수 array_key_exists()]]


==참고==
==참고==
* http://poj.org/problem?id=1316
* http://poj.org/problem?id=1316

2023년 8월 26일 (토) 15:02 기준 최신판

1 개요[ | ]

BOJ 4673 셀프 넘버
  • 자연수 n에 대해 d(n)의 값을 구하는 함수를 정의해 문제를 해결해봅니다
  • 알고리즘 분류: 에라토스테네스의 체, 입문용

2 Bash[ | ]

동작은 하지만 성능 문제가 있음.

LANG=C
SELF_NUMBERS=""

for i in `seq 1 10000`
do
        if [ ! `echo "$SELF_NUMBERS" | grep -cP " ${i} "` -ne 0 ]; then
                echo $i
        fi
        k=`echo $i | perl -pe 's/(\d)/$1 + /g'`
        i=`expr $i + ${k}0`
        SELF_NUMBERS="${SELF_NUMBERS} ${i} "
done

3 C++[ | ]

#include <iostream>
using namespace std;
#define SIZE 10000
int main() {
    int d, temp;
    bool a[SIZE+1]={};
    for(int i=1;i<=SIZE;i++) {
    	temp=i;
    	d=i;
        while(temp){
    	    d += temp%10;
    	    temp /= 10;
    	}
    	if(d<=SIZE) a[d]=true;
    }
    for(int i=1;i<=SIZE;i++) {
    	if( !a[i] ) printf("%d\n", i);
    }
}
#include <iostream>
using namespace std;
#define SIZE 10000
bool a[SIZE+1]={};
int d(int n) {
	int temp = n;
	int res = n;
    while(temp){
	    res += temp%10;
	    temp /= 10;
	}
	return res;
}
int main() {
    int temp;
    for(int i=1;i<=SIZE;i++) {
    	if( !a[i] ) printf("%d\n", i);
    	temp = d(i);
    	if( temp<=SIZE ) a[temp] = true;
    }
}

4 Java[ | ]

public class Main {
    private static final int SIZE = 10000;
    private static boolean[] flags = new boolean[SIZE+1];
    private static int d(int n) {
        int result = n;
        char[] digits = String.valueOf(n).toCharArray();
        for( int i=0; i<digits.length; i++ ) {
            result += digits[i] - '0';
        }
        return result;
    }
    public static void main(String args[]) {
        int temp;
        for(int i=1; i<=SIZE; i++) {
            if( !flags[i] ) System.out.println(i);
            temp = d(i);
            if( temp <= SIZE ) flags[temp] = true;
        }
    }
}

5 Perl[ | ]

use List::Util qw(sum);
@self_numbers = ();
for $i (1..10000) {
    print "$i\n" unless ($self_numbers[$i]);
    $v=$i + sum(split //, $i);
    $self_numbers[$v]=1;
}

6 PHP[ | ]

<?php
function d($n) { return $n + array_sum(str_split($n)); }
$self_numbers = [];
for($i=1; $i<=10000; $i++) {
    if( !array_key_exists($i,$self_numbers) ) echo $i . "\n";
    $self_numbers[d($i)] = 1;
}

7 Python[ | ]

def d(n):
    return n + sum(map(int,list(str(n))))
self_numbers = {}
for i in range(1,10001):
    if i not in self_numbers:
        print( i )
    self_numbers[d(i)] = 1

8 같이 보기[ | ]

9 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}