判断完全平方数的正确方法

我们经常碰到判读一个数是不是完全平方数的问题,这个问题看似非常简单,但写的代码往往是有bug的,容易误导初学者。下面对这个问题给出三种思路,并就其中一种最常用且最容易出问题的思路做深入分析。

要判断一个数是不是完全平方数,至少应该有两种思路,一种是看它开平方以后是不是一个整数;另一种是在一定区间内枚举x,看是否有一个x的平方是n(我们姑且不论具体实现,这应该是两种最开始的想法)。对于第二种思路,更常见于求一定区间内的数字有哪些是完全平方数,枚举的这种做法本身没什么问题。

重点是第一种思路的实现。这种思路一定会用到sqrt()函数进行开方操作,这个函数头文件是<math.h>   因此,它的返回值是一个浮点数,那么就要判断这个浮点数是否原本是整数,有人用下面这种代码来实现。

const int step=1e-6;
if((int)sqrt(n)-sqrt(x)<step||sqrt(n)-(int)sqrt(n)<step)
    return true;
但这个操作容易产生 误判,关键在于step定义为某一个很小的确定的数时不一定可以作为衡量标准 。当n很大的时候,step可能就不够用了,比如n=1e12+1时,因为sqrt(n)=1000000.0000005,由于sqrt(n)与1000000的误差小于1e-6,这个程序就会误认为此时n是一个完全平方数。总之,这个代码是有一定问题的。

解决这个问题的更好的办法是对取得的浮点数采用四舍五入的方法得到对应的整数m,然后判断m*m==n是否成立。这就是判断完全平方数的正确姿势啦!具体代码如下:

int m=floor(sqrt(n)+0.5);
if(m*m==n)
    return true;
其实除前两种想法外,还有第三种解决方法,开拓一下思路吧。

for(int i=1;n>0;i+=2)   想想这种做法的正确性何在
      n-=i;   
return 0==n;   





猜你喜欢

转载自blog.csdn.net/qq512028505/article/details/72662017