Algorithm/Jungol (수학1)

[1071] 약수와 배수

whereareyoung 2023. 9. 19. 11:49

문제

주어진 정수들 중 입력 받은 수의 약수와 배수의 합을 각각 출력하라.

 

예를 들면,

6개의 정수 2, 3, 5, 12, 18, 24 가 주어지고 12를 입력 받은 경우 

12의 약수는 2, 3, 12 이고

12의 배수는 12, 24 이다.

입력

첫 줄에 정수의 개수 n (1<= n <=40)을 입력 받는다.

둘째 줄에는 n개의 정수를 한 줄에 입력 받는다. 

셋째 줄에는 약수와 배수를 구할 정수 m(1<=m<=100)을 입력 받는다.

출력

첫 줄에는 정수 m의 약수의 합을 둘째 줄에는 정수 m의 배수의 합을 출력한다.


예제 입력 

6
2 3 5 12 18 24
12

 

예제 출력

17
36


처리조건

(1) n 은 (1<= n <=40) 을 만족해야 한다. 

(2) m은 (1<=m<=100) 을 만족해야 한다. 

if (1 <= n && n <= 40)
{
	if (1 <= m && m <= 100)
	{
	}
}

따라서 위와 같이 조건을 설정하고 진행하였으며 조건에 부합하지 않을 경우 return 0; 으로 종료하도록 세팅했다. 

 

<입력의 설계>

- 배열의 크기를 입력받을 변수 n, 정수 리스트를 입력할 배열 arr[] 을 선언하였다. 

- 배열 arr[] 의 크기는 n이 1~40이하의 정수이기 때문에 arr[40] 으로 제한해 데이터 낭비를 줄였다. 

 

- 배수와 약수를 계산할 기준이 될 변수 m을 선언하였다. 

- 약수를 저장할 변수 Div, 배수를 저장할 변수 Mul을 선언하였다. 

 

- 숫자 크기 제한등의 조건을 참고해 다음과 같이 뼈대를 세웠다. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int n, m;
	int arr[40] = { 0 };
	int Div = 0, Mul = 0;
	
	scanf("%d", &n);

	if (1 <= n && n <= 40)
	{
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &arr[i]);
		}

		scanf("%d", &m);

		if (1 <= m && m <= 100)
		{
		}
	}
	return 0;
}

 

<출력의 설계>

- m의 약수가 arr[i] 의 리스트와 같을 경우 Div 변수에 더하여 저장 

if ((m % arr[i])==0) Div += arr[i];

m % arr[i] == 0 일 경우, 나누어 떨어지기 때문에 arr[i]은 m의 약수이다. 
또한 입력받은 숫자 리스트에 있는 숫자와 같다는 것을 의미한다. 
따라서 Div변수에 더해준다. 

 

- m의 배수 가 arr[i] 의 리스트와 같을 경우Mul 변수에 더하여 저장

if ((arr[i] % m)==0) Mul += arr[i];

arr[i] % m == 0 일 경우, 나누어 떨어지기 때문에 arr[i]은 m의 배수이다. 
또한 입력받은 숫자 리스트에 있는 숫자와 같다는 것을 의미한다. 
따라서 Mul 변수에 더해준다. 

 

- 최종 출력

printf("%d\n", Div);
printf("%d\n", Mul);

printf 함수를 이용해 Div와 Mul을 출력하여 주었다. 

 

설계특징

나는 직관적으로 " ==0 " 을 사용하여 식을 짰는데, 전체에 괄호를 한번 더 묶고 " ! " 를 해 주어도 된다. 

 

제출답변

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int n, m;
	int arr[40] = { 0 };
	int Div = 0, Mul = 0;
	
	scanf("%d", &n);

	if (1 <= n && n <= 40)
	{
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &arr[i]);
		}

		scanf("%d", &m);

		if (1 <= m && m <= 100)
		{
			for (int i = 0; i < n; i++)
			{
				if ((m % arr[i]) == 0) Div += arr[i];
				if ((arr[i] % m)==0) Mul += arr[i];
			}

			printf("%d\n", Div);
			printf("%d\n", Mul);
		}
	}
	return 0;
}

'Algorithm > Jungol (수학1)' 카테고리의 다른 글

[1658] 최대공약수와 최소공배수  (0) 2023.09.19
[2809] 약수  (0) 2023.09.19
[1402] 약수구하기  (0) 2023.09.19
[1430] 숫자의 개수  (0) 2023.09.19
[1691] 곱셈  (0) 2023.09.19