Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 N 이하의 완전제곱수이자 완전세제곱수인 숫자 개수 세기

하나의 숫자 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