int IsSquare( int n );
其中n是用户传入的参数,在长整型范围内。如果n是完全平方数,则函数IsSquare必须返回1,否则返回0。
#include
#include
int IsSquare( int n );
int main()
{
int n;
scanf("%d", &n);
if ( IsSquare(n) ) printf("YES\n");
else printf("NO\n");
return 0;
}
/* 你的代码将被嵌在这里 */
所需的头文件:
#include
原型
double sqrt(double x);
//注意返回值为double
所需的头文件:
#include
原型:
double floor (double x);
功能:“下取整”,即取不大于x的最大整数(类似数学中的[ x ])
可以先求出n的平方根,然后看它是否为整数,即用一个int型变量c存储sqrt(n)四舍五入后的整数,然后判断c*c是否等于n。
#include
int IsSquare( int n )
{
int c = floor(sqrt(n)+0.5);
if(c*c == n)
return 1;
else
return 0;
}
你可能会问:可不可以这样写↓ ?
#include
int IsSquare( int n )
{
if(sqrt(n)== floor(sqrt(n))
return 1;
else
return 0;
}
↓
→直接判断 sqrt(n)是否为整数
理论上当然没问题,但这样写不保险,因为浮点数的运算(和函数)有可能存在误差。
假设在经过大量计算后,由于误差的影响,整数1变成了0.9999999999,floor的结果会是0而不是1。为了减小误差的影响,一般改成四舍五入,即 floor(x+0.5)。如果难以理解,可以想象成在数轴上把一个单位区间往左移动0.5个单位的距离。floor(x)等于1的区间为[1,2),而floor(x+0.5)等于1的区间为[0.5,1.5)
(这里只是为了方便查阅,前面是有这段代码的)
#include
int IsSquare( int n )
{
int c = floor(sqrt(n)+0.5);
if(c*c == n)
return 1;
else
return 0;
}