本题要求实现一个函数,判断任一给定整数N
是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
函数接口定义:
int IsTheNumber ( const int N );
其中N
是用户传入的参数。如果N
满足条件,则该函数必须返回1,否则返回0。
裁判测试程序样例:
#include <stdio.h>
#include <math.h>
int IsTheNumber ( const int N );
int main()
{
int n1, n2, i, cnt;
scanf("%d %d", &n1, &n2);
cnt = 0;
for ( i=n1; i<=n2; i++ ) {
if ( IsTheNumber(i) )
cnt++;
}
printf("cnt = %d\n", cnt);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
105 500
输出样例:
cnt = 6
我的解题思路如下:
1.获取到N的每一位,存到数组中
2.两次循环遍历数组,判断是否有相同的数组
3.若有两个相同的数字的时候,然后接着判断N是否是完全平方数
4.根据判断返回1或0
贴出我的解题代码如下:
int IsTheNumber(const int N)
{
int M=N;//因为给的N是const修饰,无法修改,所以将M=N,用于获取每一位数字
int i,j=0;
int a[10];//定义存储每一位数字的数组
while(M>=10)
{
a[j++]=M%10;//将除最高位之外的每一位数字存储到数组中
M=M/10;
}
a[j]=M;//最后将最高的那位数字存储到数组中
int x=(int)sqrt(N);//将N开平方时候强转成int
int y=x*x;//计算x的平方
int m,n;
for(m=0; m<=j; m++)
{
for(n=m+1; n<=j; n++)
{
//两次循环数组,注意n是从m+1开始的,也就是只与其后边的比较即可
if(a[m]==a[n])//如果出现了一组相同的数字
{
if(y==N)//然后判断N是否是完全平方数
{
return 1;//直接就返回1
}
else
{
return 0;
}
}
}
}
return 0;
}
解释一下代码中判断完全平方数的做法:
就拿133这个数来说,因为将其开平方之后是得不到整数的,那么(int)sqrt(133)=11,而11*11不等于133,从而这就判断出来不是完全平方数;而对于144而言,(int)sqrt(144)得到的就是12,从而就可以判断出其就是完全平方数=。=
还有一点:
在判断是否是完全平方数的时候,最直接想到的方法是:通过for循环遍历1—N/2这个区间,如下:
for(i=1;i<=N/2;i++){
if(i * i == N){
return 1;
}
}
就本题而言,使用这种方式是可以通过检测的(得20分)
但是大家一看就知道,耗时很多,没错,我试了一下16ms
所以说,如果遇到了要求时间运行更严格的要求的话,就需要使用贴出来的代码上的那种方法,2ms=。=
就这个判断是否是完全平方数这点做个小总结吧:
在判断一个数是否是完全平方数的时候(如:144=12*12):
1.首先想到的是通过循环遍历到n/2,然后进行判断 i*i==n,这是最常见的办法,但是消耗的时间会很长,在刷算法题的时候可能会出现运行超时的错误
2.通过引入math.h头文件后,再进行判断
int x=(int)sqrt(N)
int y=x*x
if(y==N){
就说明这个数是完全平方数
}
我是小K,算法这块有着很大的短板,所以现在正在慢慢恶补,若以上解释有不当之处,路过的朋友还请多多请教=。=