문제
이번 글에서는 배열에 포함된 완전제곱수(perfect square) 요소들의 합을 구하는 C 프로그램을 작성해 보겠습니다.
배열의 요소 개수를 입력받은 뒤, 그 요소들 중 완전제곱수에 해당하는 값들을 모두 찾아 더한 합계를 출력하는 것이 목표입니다.
해결 방법
먼저 예시를 통해 문제를 이해해 보겠습니다.
입력 = 1, 2, 3, 4, 5, 9, 10, 11, 16
완전제곱수 = 1, 4, 9, 16
합 = 1 + 4 + 9 + 16 = 30
출력: 30
알고리즘
배열의 완전제곱수 요소들의 합을 구하려면 아래 알고리즘을 따르면 됩니다.
1단계 − 실행 시점에 배열의 요소 개수를 입력받습니다.
2단계 − 배열의 각 요소를 입력받습니다.
3단계 − 합계를 저장할 변수 sum을 선언하고 0으로 초기화합니다.
4단계 − 각 배열 요소가 완전제곱수인지 여부를 검사합니다.
5단계 − 해당 요소가 완전제곱수라면 sum = sum + number로 합계에 더합니다.
6단계 − 최종 합계 sum을 반환합니다.
핵심 로직 설명
완전제곱수 판별은 sqrt() 함수를 활용합니다. 숫자의 제곱근을 실수형(fVar)과 정수형(iVar)으로 각각 구한 뒤 두 값을 비교하여, 소수점 이하가 없이 일치하면 그 수는 완전제곱수입니다. 예를 들어 16의 제곱근은 4.0이므로 정수형 변환 후에도 4로 동일하지만, 10의 제곱근은 약 3.162이므로 정수 부분 3과 달라 완전제곱수가 아닙니다.
예제 코드
다음은 배열에서 완전제곱수 요소의 합을 구하는 전체 C 프로그램입니다.
#include<stdio.h>
#include<math.h>
int isPerfectSquare(int number){
int iVar;
float fVar;
fVar=sqrt((double)number);
iVar=fVar;
if(iVar==fVar)
return number;
else
return 0;
}
int main(){
int n;
printf("enter no: of elements:");
scanf("%d",&n);
int arr[n];
int i;
printf("enter the elements in an array:\n");
for(i = 0; i < n; i++){
scanf("%d",&arr[i]);
}
int sum = 0;
for(i = 0; i < n; i++){
sum = sum + isPerfectSquare(arr[i]);
}
printf("sum=%d",sum);
return 0;
}
실행 결과
위 프로그램을 컴파일하여 실행하면 다음과 같은 결과를 확인할 수 있습니다.
실행 1:
enter no: of elements:5
enter the elements in an array:
1
3
5
9
10
sum=10
실행 2:
enter no: of elements:5
enter the elements in an array:
1
4
9
16
25
sum=55
첫 번째 실행에서는 1과 9만 완전제곱수이므로 합이 10이 되고, 두 번째 실행에서는 입력한 5개 값(1, 4, 9, 16, 25)이 모두 완전제곱수이므로 합이 55가 됩니다.