본문 바로가기
PROGRAMMING CODE/C

[SOLUTION] 완전수 판별

by daye_ 2021. 10. 18.

[문제] 완전수는 자기 자신을 제외한 양의 약수를 더했을 때 자기 자신이 되는 양의 정수를 말한다.

대표적인 완전수는 6, 28, 496등이다.

ex) 6 = 1 + 2 + 3

28 = 1 + 2 + 4 + 7 + 14

496 = 1+ 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248

양의 정수를 입력받은 후 해당 정수가 완전수 인지를 판단하는 프로그램을 작성하시오.

[프로그램 내에 반드시 포함되어야 하는 사용자정의 함수]

- int testPetfect(int *) : 정수 포인터를 입력받아 해당 정수가 완전수 인지의 여부에 따라 만약 완전수이면 1을, 그렇지 않으면 0을 반환한다.

- void printFactors(int *) : 정수 포인터를 입력받아 입력된 수가 완전수이면 입력받은 수를 제외한 모든 약수를 출력하는 기능을 수행한다.

예를들어 입력받은 수가 6이라면 이 수는 완전수이다. 따라서 6일 제외한 1,2,3을 화면에 출력한다.

 

#include <stdio.h>
#pragma warning(disable:4996) //scanf오류 방지 코드

int testPerfect(int*);
void printFactors(int *);

int main() {
	int num = 0, perfectNum = 0,numCheck;

	for (;;) { //0이하면 다시 입력받는 코드
		printf("How many numbers would you like to test? ");
		scanf("%d", &num);
		if (num > 0) break; 
	}
	printf("\n");
	for (int i = 0; i < num; i++) {
		printf("Please enter a possible perfect number: ");
		getchar();
		scanf("%d", &perfectNum);
		numCheck = testPerfect(&perfectNum);
		printf("%d:", perfectNum);
		if (numCheck == 1&& (perfectNum!=0))  printFactors(&perfectNum);  //완전수일때
		else printf("NOT PERFECT");
		printf("\n\n");
	}
	return 0;
}

int testPerfect(int* num) {
	int sum = 0;
	for (int i = (*num); i > 0; i--) {
		if (((*num)%i) == 0) {
			if (i == *num) continue; //본인일때 건너뜀
			sum += i;
		}
	}
	if (*num == sum) return 1;
	else return 0;

}

void printFactors(int *num) {
	for (int i = (*num); i > 0; i--) {
		if (((*num) % i) == 0) {
			if (i == *num) continue;
			printf("%d ", i);
		}
	}
}

'PROGRAMMING CODE > C' 카테고리의 다른 글

[SOLUTION] 흐르는 물  (0) 2021.10.18
[SOLUTION] 회문 정수 판별  (0) 2021.10.18
[SOLUTION] 행렬의 덧셈 뺄셈  (0) 2021.10.18
[BAEKJOON] No.14681 C언어  (0) 2021.10.18
[BAEKJOON] No.11022 C언어  (0) 2021.10.18