61
풀이
최댓값이 10000 임을 이용해 조건문과 나머지 연산을 써서 각 자릿수를 더해 배열 값으로 처리할 수 있습니다. 파이썬에선 글자 자체를 리스트로 만들면 한 자리씩 나뉘기 때문에 각 자릿수 더하기가 용이합니다.
코드
C
#include<stdio.h>
int d[10001];
int dn(int i) {
int res = i;
if (i >= 10000) { res += i / 10000; i %= 10000; }
if (i >= 1000) { res += i / 1000; i %= 1000; }
if (i >= 100) { res += i / 100; i %= 100; }
if (i >= 10) { res += i / 10; i %= 10; }
return res += i;
}
int main() {
int i = 0;
for (i = 1; i <= 10000; i++) {
d[dn(i)] = 1;
}
for (i = 1; i <= 10000; i++) {
if (!d[i]) printf("%d\n", i);
}
return 0;
}
C++
#include<iostream>
using namespace std;
int d[10001];
int dn(int i) {
int res = i;
if (i >= 10000) { res += i / 10000; i %= 10000; }
if (i >= 1000) { res += i / 1000; i %= 1000; }
if (i >= 100) { res += i / 100; i %= 100; }
if (i >= 10) { res += i / 10; i %= 10; }
return res += i;
}
int main() {
for (int i = 1; i <= 10000; i++) {
d[dn(i)] = 1;
}
for (int i = 1; i <= 10000; i++) {
if (!d[i]){
cout<<i<<endl;
}
}
return 0;
}
Java
public class Main {
public static void main(String[] args) {
int[] d = new int[10001];
for (int i = 1; i <= 10000; i++){
if(dn(i)<10001){
d[dn(i)] = 1;
}
}
for (int i = 1; i <= 10000; i++){
if (d[i] != 1){
System.out.println(i);
}
}
}
public static int dn(int i){
int res = i;
if (i >= 10000) { res += i / 10000; i %= 10000; }
if (i >= 1000) { res += i / 1000; i %= 1000; }
if (i >= 100) { res += i / 100; i %= 100; }
if (i >= 10) { res += i / 10; i %= 10; }
return res += i;
}
}
Python
def dn(i):
res = i
for n in list(str(i)):
res += int(n)
return res
d = []
for i in range(1, 10001):
d.append(dn(i))
for i in range(1, 10001):
if i not in d:
print(i)
문제 출처
https://www.acmicpc.net/problem/4673