하나의 숫자 N이 주어졌을 때, 1부터 N까지의 범위에서 완전제곱수(perfect square)이면서 동시에 완전세제곱수(perfect cube)인 숫자의 개수를 구하는 것이 목표입니다. 예를 들어, 1과 64는 완전제곱수이자 완전세제곱수에 해당합니다.
이 문제를 해결하기 위해 제곱근을 계산하는 sqrt() 함수와 세제곱근을 계산하는 cbrt() 함수를 사용합니다.
예시를 통해 자세히 살펴보겠습니다.
입력 − N=100
출력 − 완전제곱수이자 완전세제곱수인 숫자의 개수 − 2
설명 − 1부터 100까지의 숫자 중 1과 64만이 완전제곱수이면서 완전세제곱수입니다.
입력 − N=5000
출력 − 완전제곱수이자 완전세제곱수인 숫자의 개수 − 3
설명 − 1부터 5000까지의 숫자 중 1, 64, 4096만이 두 조건을 모두 만족합니다.
참고: 여섯제곱수의 성질
어떤 수가 완전제곱수이면서 동시에 완전세제곱수가 되려면, 그 수는 반드시 어떤 자연수의 여섯제곱(n⁶) 형태여야 합니다. 예를 들어 1⁶=1, 2⁶=64, 4⁶=4096입니다. 이러한 수는 지수가 커질수록 매우 빠르게 증가하기 때문에 특정 범위 내에서 아주 드물게 나타납니다.
프로그램에 사용된 접근 방식
정수 N을 입력받습니다.
getCount(int n) 함수는 N을 전달받아 N 이하의 숫자 중 완전제곱수이면서 완전세제곱수인 수의 개수를 반환합니다.
카운트 변수를 0으로 초기화합니다.
i=1부터 i=N까지 반복하면서,
floor(sqrt(i))==ceil(sqrt(i))라면 i는 완전제곱수입니다. 즉, 제곱근의 내림값과 올림값이 같다는 것은 그 제곱근이 정수라는 의미입니다.이어서
floor(cbrt(i))==ceil(cbrt(i))인지 확인하고, 참이라면 i는 완전세제곱수이므로 count를 1 증가시킵니다.반복문이 종료되면 count를 결과로 반환합니다.
예제 코드
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
int getCount(int n){
int count=0;
for(int i=1;i<=n;i++){
if(floor(sqrt(i))==ceil(sqrt(i))){
if(floor(cbrt(i))==ceil(cbrt(i))){
count++;
//cout<<i<<" ";
}
}
}
return count;
}
int main(){
int N=100;
cout<<endl<<"Numbers upto N that are perfect squares and perfect cubes:"<<getCount(N);
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
Numbers upto N that are perfect squares and perfect cubes:2