📜  C程序,检查数字是否为Perfect Cube

📅  最后修改于: 2021-05-06 21:45:30             🧑  作者: Mango

给定数字N ,任务是编写C程序以检查给定的数字是否为完美的立方。

例子:

方法1:天真的方法要查找给定数字的立方根,请对从1N的所有自然数进行迭代,并检查此范围内任何数字的立方是否等于给定数字N,然后打印否则打印

下面是上述方法的实现:

C
// C program for the above approach
#include 
#include 
  
// Function to check if a number is
// a perfect Cube
void perfectCube(int N)
{
    for (int i = 1; i < N; i++) {
  
        // If cube of i is equals to N
        // then print Yes and return
        if (i * i * i == N) {
            printf("Yes");
            return;
        }
    }
  
    // No number was found whose cube
    // is equal to N
    printf("No");
    return;
}
  
// Driver Code
int main()
{
    // Given Number
    int N = 216;
  
    // Function Call
    perfectCube(N);
    return 0;
}


C
// C program for the above approach
#include 
#include 
  
// Function to check if a number is
// perfect cube using inbuilt function
void perfectCube(int N)
{
    int cube_root;
    cube_root = (int)round(pow(N, 1.0 / 3.0));
  
    // If cube of cube_root is equals
    // to N, then print Yes else No
    if (cube_root * cube_root * cube_root == N) {
        printf("Yes");
        return;
    }
    else {
        printf("No");
        return;
    }
}
  
// Driver Code
int main()
{
    // Given number N
    int N = 216;
  
    // Function Call
    perfectCube(N);
    return 0;
}


C
// C program for the above approach
#include 
#include 
  
// Function to check if a number is
// a perfect Cube using binary search
void perfectCube(int N)
{
    int start = 1, end = N;
    while (start <= end) {
  
        // Calculating mid
        int mid = (start + end) / 2;
  
        // If N is a perfect cube
        if (mid * mid * mid == N) {
            printf("Yes");
            return;
        }
  
        // If mid^3 is smaller than N,
        // then move closer to cube
        // root of N
        if (mid * mid * mid < N) {
            start = mid + 1;
        }
  
        // If mid^3 is greater than N
        else
            end = mid - 1;
    }
  
    printf("No");
    return;
}
  
// Driver Code
int main()
{
    // Given Number N
    int N = 216;
  
    // Function Call
    perfectCube(N);
    return 0;
}


输出:
Yes

复杂度分析:

  • 时间复杂度: O(N),只需要遍历该解决方案,因此时间复杂度为O(N)。
  • 辅助空间: O(1)。需要恒定的额外空间。

方法2:使用内置函数该想法是使用内置函数pow()查找一个数字的立方根,该立方根返回数字N的立方根的底值。如果此数字的立方等于N ,则N是一个理想的立方,否则N不是一个理想的立方。

下面是上述方法的实现:

C

// C program for the above approach
#include 
#include 
  
// Function to check if a number is
// perfect cube using inbuilt function
void perfectCube(int N)
{
    int cube_root;
    cube_root = (int)round(pow(N, 1.0 / 3.0));
  
    // If cube of cube_root is equals
    // to N, then print Yes else No
    if (cube_root * cube_root * cube_root == N) {
        printf("Yes");
        return;
    }
    else {
        printf("No");
        return;
    }
}
  
// Driver Code
int main()
{
    // Given number N
    int N = 216;
  
    // Function Call
    perfectCube(N);
    return 0;
}
输出:
Yes

复杂度分析:

  • 时间复杂度: O(N),因为pow()函数在O(N)中起作用,所以时间复杂度为O(N)。
  • 辅助空间: O(1)。需要恒定的额外空间。

方法3:使用二进制搜索该想法是使用二进制搜索来解决此问题。 i * i * i的值单调增加,因此可以使用二进制搜索解决问题。
步骤如下:

  1. Low和High分别初始化为0和N。
  2. 迭代直到低≤高,然后执行以下操作:
    • 找到=(low + high)/ 2mid值。
    • 检查mid * mid * mid是否等于N,然后打印“是”
    • 如果mid的立方小于N,则通过将low更新为mid + 1,在搜索空间的后一半中搜索较大的值。
    • 如果mid的立方大于N,则通过将high更新为mid – 1在搜索空间的前一半中搜索较小的值。
  3. 如果在上述步骤中未获得N的立方,则打印“否”

下面是上述方法的实现:

C

// C program for the above approach
#include 
#include 
  
// Function to check if a number is
// a perfect Cube using binary search
void perfectCube(int N)
{
    int start = 1, end = N;
    while (start <= end) {
  
        // Calculating mid
        int mid = (start + end) / 2;
  
        // If N is a perfect cube
        if (mid * mid * mid == N) {
            printf("Yes");
            return;
        }
  
        // If mid^3 is smaller than N,
        // then move closer to cube
        // root of N
        if (mid * mid * mid < N) {
            start = mid + 1;
        }
  
        // If mid^3 is greater than N
        else
            end = mid - 1;
    }
  
    printf("No");
    return;
}
  
// Driver Code
int main()
{
    // Given Number N
    int N = 216;
  
    // Function Call
    perfectCube(N);
    return 0;
}
输出:
Yes

复杂度分析:

  • 时间复杂度: O(log N)。二进制搜索的时间复杂度为O(log N)。
  • 辅助空间: O(1)。需要恒定的额外空间。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。