一)题目要求
⭐1,函数接口定义:
int IsSquare( int n );
其中n是用户传入的参数,在长整型范围内。如果n是完全平方数,则函数IsSquare必须返回1,否则返回0。
⭐2,裁判测试程序样例:
#include <stdio.h> #include <math.h> int IsSquare( int n ); int main() { int n; scanf("%d", &n); if ( IsSquare(n) ) printf("YES\n"); else printf("NO\n"); return 0; } /* 你的代码将被嵌在这里 */
二)如何判断n是否为完全平方数?
🌕铺垫1:“开平方”函数sqrt( )
所需的头文件:
#include<math.h>
原型
double sqrt(double x); //注意返回值为double
🌕铺垫2:函数floor( )
所需的头文件:
#include<math.h>
原型:
double floor (double x);
功能:“下取整”,即取不大于x的最大整数(类似数学中的[ x ])
🌕判断是否为完全平方数
可以先求出n的平方根,然后看它是否为整数,即用一个int型变量c存储sqrt(n)四舍五入后的整数,然后判断c*c是否等于n。
#include<math.h> int IsSquare( int n ) { int c = floor(sqrt(n)+0.5); if(c*c == n) return 1; else return 0; }
你可能会问:可不可以这样写↓ ?
#include<math.h> 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<math.h> int IsSquare( int n ) { int c = floor(sqrt(n)+0.5); if(c*c == n) return 1; else return 0; }