有效完全平方数和求平方根的多种解法

1. 完全平方数

给定一个 正整数 num (1 <= num <= 2^31 - 1),编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。

1.1 解法一

使用库函数,求得 sqrt(num),然后遍历 1 到 sqrt(num) 数字,分别相乘与 num 比较

class Solution {
public:
    bool isPerfectSquare(int num) 
    {
        for(int i=1;i<=sqrt(num);i++)
        {
            if (i*i == num)
            {
                return true;
            }
        }
        return false;
    }
};

1.2 解法二

不使用库函数,遍历 1-n 每个数字相乘结果,如果结果与 num 相等则返回 true,如果大于 num,则返回 false,注意要是用 long long 型数据,避免溢出。

class Solution {
public:
    bool isPerfectSquare(int num) {
        for(long long i=1;i<=num;i++)
        {
            if (i*i == num)
            {
                return true;
            }
            if (i*i >num)
            {
                return false;
            }
        }
        return false;
    }
};

1.3 解法三

使用二分法来解决。

class Solution {
public:
    bool isPerfectSquare(int num) {
        int left = 1;
        int ritht = num;
        
        for(int i=1;left<=ritht;i++)
        {
            int mid = left + (ritht - left)/2;
            // int product = mid * mid 溢出
            int temp = num / mid;
            if (mid < temp)
            {
                left = mid + 1;
            }
            else if (mid > temp)
            {
                ritht = mid - 1;
            }
            else if (mid == temp)
            {
                if (num % mid == 0)	// 因为上面是 整除,所以此处要加模判断
                {
                     return true;
                }
                else
                {
                    return false;
                }
            }
        }
        return false;
    }
};

2. 求平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

2.1 遍历相乘

class Solution {
public:
    int mySqrt(int x) {
        for (int i=1; i<=x; i++)
        {
            if (i == x/i)	// 防止溢出,不使用 i*i == x 的写法
            {
                return i;
            }
            else if (i > x/i)
            {
                return i-1;
            }
        }
        return 0;
    }
};

2.2 二分法

class Solution {
public:
    int mySqrt(int x) {
        int low = 0;
        int high = x;

        for(int i=1;low<high;i++)
        {
            int mid = low + (high - low) / 2 + 1;
            if (mid > x / mid)
            {
                high = mid - 1;
            }
            else 
            {
                low = mid;
            }
        }
        return low;
    }
};
在C语言中,一个整数是否为完全平方数可以采用几种不同的算法。这里简单介绍两种常见的方法: 1. **试除法**(Brute Force Method): 这是最直观的方法。遍历从1到该整数平方根的所有数字,看能否找到一个数乘以其本身等于给定的数。如果找到,则它是完全平方数;否则不是。 ```c #include <stdio.h> #include <math.h> int isPerfectSquare(int num) { int root = sqrt(num); if (root * root == num) return 1; // 返回1表示是完全平方数 else return 0; // 返回0表示不是完全平方数 } int main() { int n; printf("Enter a number: "); scanf("%d", &n); if (isPerfectSquare(n)) printf("%d is a perfect square.", n); else printf("%d is not a perfect square.", n); return 0; } ``` 2. **二分查找法**(Binary Search): 利用完全平方数的性质,我们知道它们在有序列表中的位置会形成一个等差序列。我们可以先计算出需要查找范围的上限(即目标数开方后的整数部分),然后在范围内使用二分查找寻找符合条件的平方数。 ```c #include <stdio.h> #include <math.h> int binarySearchForPerfectSquare(int low, int high, int num) { while (low <= high) { int mid = low + (high - low) / 2; if (mid * mid == num) return mid; else if (mid * mid > num) high = mid - 1; else low = mid + 1; } return -1; // 如果没有找到则返回-1 } int main() { int n; printf("Enter a number: "); scanf("%d", &n); int result = binarySearchForPerfectSquare(0, n, n); if (result != -1) printf("%d is a perfect square of %d.", n, result * result); else printf("%d is not a perfect square.", n); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值