문제 : https://www.acmicpc.net/problem/9506
1) 내 답변
// 약수의 합을 구해가면서 배열에 저장한 이후, 완전수일 경우 출력하고 아니면 완전수가 아니라고 출력한다.
#include <cstdio>
int main()
{
int n = 0, sum = 0, cnt = 0;
int arr[50000] = {0, };
while(1)
{
cnt = 0;
sum = 1;
scanf("%d", &n);
if ( n == -1 ) break;
for ( int i = 2 ; i <= n / 2 ; i++ )
{
if ( n % i == 0 )
{
sum += i;
arr[cnt] = i;
cnt++;
}
}
if ( n != sum )
{
printf("%d is NOT perfect.\n", n);
}
else
{
printf("%d = 1", n);
for ( int j = 0 ; j < cnt ; j++ )
{
printf(" + %d", arr[j]);
}
putchar('\n');
}
}
return 0;
}
2) 다른 사람의 답변
// 약수의 합 계산 이후, 해당 수가 완전수일 경우 다시 한 번 계산하면서 약수 목록을 출력한다.
#include<stdio.h>
int main(){
int n,i,sum=0;
while(scanf("%d",&n)){
if(n==-1)break;
for(i=1;i<n;i++)
if(n%i==0)sum+=i;
if(sum==n){
printf("%d = 1",n);
for(i=2;i<n;i++)
if(n%i==0)printf(" + %d",i);
printf("\n");
}
else printf("%d is NOT perfect.\n",n);
sum=0;
}
return 0;
}
// 완전수 리스트를 꿰고 나서(...) 그 수가 들어오면 약수 리스트를 출력한다.
#include <stdio.h>
int main(){
while(1){
int x;
scanf("%d", &x);
if (x == -1) break;
if (x == 6 || x == 28 || x == 496 || x == 8128) {
printf("%d = 1 ", x);
for (int i = 2; i <= x / 2; i++) {
if (x % i == 0) printf("+ %d ", i);
}
printf("\n");
}
else printf("%d is NOT perfect.\n", x);
}
}
# 약수를 구해 배열에 넣는데, 넣을 때 해당 약수로 입력한 n을 나눈 수도 같이 저장하고 n의 제곱근까지만 for문을 돌린다.
def yaksu(n):
ys = {1}
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
ys.add(i)
ys.add(n // i)
return ys
while 1:
n = int(input())
if n == -1: break
ys = yaksu(n)
if sum(ys) == n:
print(n, "= ", end="")
print(*sorted(list(ys)), sep=" + ")
else:
print(n, "is NOT perfect.")
'프로그래밍 > 알고리즘' 카테고리의 다른 글
백준 2581번: 소수 (0) | 2024.03.31 |
---|---|
백준 1978번: 소수 찾기 (0) | 2024.03.22 |
백준 2501번: 약수 구하기 (0) | 2024.03.20 |
백준 5086번: 배수와 약수 (0) | 2024.03.15 |
백준 2903번: 중앙 이동 알고리즘 (0) | 2024.02.27 |