【PTA—6-7 统计某类完全平方数】本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。

本题要求实现一个函数,判断任一给定整数N是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。

函数接口定义:

int IsTheNumber ( const int N );

其中N是用户传入的参数。如果N满足条件,则该函数必须返回1,否则返回0。

裁判测试程序样例:

#include 
#include 

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,算法这块有着很大的短板,所以现在正在慢慢恶补,若以上解释有不当之处,路过的朋友还请多多请教=。=

 

你可能感兴趣的:(PTA刷题,C语言,C语言刷题)