给定数字N ,任务是编写C程序以检查给定的数字是否为完美的立方。
例子:
Input: N = 216
Output: Yes
Explanation:
As 216 = 6*6*6.
Therefore the cube root of 216 is 6.
Input: N = 100
Output: No
方法1:天真的方法要查找给定数字的立方根,请对从1到N的所有自然数进行迭代,并检查此范围内任何数字的立方是否等于给定数字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的值单调增加,因此可以使用二进制搜索解决问题。
步骤如下:
- 将Low和High分别初始化为0和N。
- 迭代直到低≤高,然后执行以下操作:
- 找到=(low + high)/ 2的mid值。
- 检查mid * mid * mid是否等于N,然后打印“是” 。
- 如果mid的立方小于N,则通过将low更新为mid + 1来在搜索空间的后一半中搜索更大的值。
- 如果mid的立方大于N,则通过将high更新为mid – 1在搜索空间的前一半中搜索较小的值。
- 如果在上述步骤中未获得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基础课程》。