一聚教程网:一个值得你收藏的教程网站

热门教程

C 判断一个数是否是完全平方数程序

时间:2022-06-25 04:53:11 编辑:袖梨 来源:一聚教程网

若一个整数a为另一个整数b的平方,则称a为完全平方数,现在输入n个正整数,判断他们中有几个是完全平方数

这道底在小数据的时候可能比较简单,但遇到大数据的时候,就显得心有余而力不足了。

首先我们需要用long long,这种时候,我第一是想到用减法,开平方,用a-(int)a的方法,结果发现数字小于一定程度的时候,会近似的等于0,这个时候系统也通过了,默认其等于0,就算改成0.0也无法改变这个事实。

相等当然也是行不通的,理论上而言,永远都不能相信浮点数,浮点数不应该作为条件判断。

于是最终我们想到了用转换后的数字乘法,如果相等就是OK哒,如果不等的话证明开平方是小数。

这里可以用(long long)转换,也可以直接声明一个long long的变量,来存平方后的数,会自动转换为long long的值。

第二篇文章有近似判断的方法,告诉我们不是 == 0.0 而是要给其一个浮点数导致的误差区间。

源代码:

例子

 代码如下 复制代码

#include
#include
void main(){
int n ;
printf("请输入一个数:") ;
scanf("%d", &n) ;
if(n == (int)sqrt(n)*(int)sqrt(n))
printf("是完全平方数!\n") ;
else
printf("不是完全平方数!\n") ;
}

例子

 代码如下 复制代码

#include
#include
int main(void)
{
    int counter = 0;
    long long num, sqr;
    int n, i;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%lld", &num);
        sqr = sqrt(num);
        if (sqr * sqr == num)
            counter++;
    }
    i = 1.0;
    printf("%lld", sqr);
    return 0;
}

例子

 代码如下 复制代码

bool isSqr(int n)
{
    int a = (int)(sqrt(n) + 0.5);  //四舍五入求整,又学到一招
     return a * a == n;
}

bool isSqr(int n)
 {
     int a = (int)(sqrt(n) + 0.0001);
     return a * a == n;
 }
 bool isSqr(int n)
 {
     int a = (int)sqrt(n * 1.0);
     if(a*a == n || (a+1)*(a+1) == n || (a-1)*(a-1) == n)
         return true;
     return false;
 }
 bool isSqr(int n)
 {
     int a = (int)(sqrt(n * 1.0));
     return a * a == n;
 }

个人倾向于使用第一种写法. 第二种和第一种其实差不多.
第三种, 需要判断(a-1)*(a-1) == n 吗? 我觉得不需要.
第四种, 基本上是错误的, 可能会漏掉某些完全平方数. 除非sqrt(n) >= n^0.5 恒成立

热门栏目