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

本题要求实现一个函数,判断任一给定整数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,算法这块有着很大的短板,所以现在正在慢慢恶补,若以上解释有不当之处,路过的朋友还请多多请教=。=

 

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
判断一个整数n是否满足条件:既是完全平方数,又至少有两个整数平方根,可以通过以下方式实现函数: 首先,判断n是否完全平方数。可以使用二分法来查找n的平方根。 定义变量left为1,变量right为n,循环查找直到left大于right为止。 在每一次循环中,计算中间值mid = (left + right) // 2,并计算mid的平方。 如果mid的平方等于n,则说明n是完全平方数,返回True。 如果mid的平方小于n,则更新left为mid + 1。 如果mid的平方大于n,则更新right为mid - 1。 如果循环结束都没有找到完全平方数,则返回False。 接下来,判断n是否至少两个整数平方根。 定义count为0,用于记录整数平方根的个数。 从1到n的平方根进行循环,如果某个整数的平方等于n,则count加1。 最后,如果count大于等于2,则返回True,否则返回False。 整个函数实现如下: ```python import math def check_number(n): # 判断n是否完全平方数 left = 1 right = n while left <= right: mid = (left + right) // 2 square = mid * mid if square == n: return True elif square < n: left = mid + 1 else: right = mid - 1 # 判断n是否至少两个整数平方根 count = 0 for i in range(1, math.isqrt(n) + 1): if i * i == n: count += 1 if count >= 2: return True else: return False ``` 使用该函数可以判断任意给定整数n是否满足条件。例如,调用函数`check_number(25)`将返回True,因为25是一个完全平方数,并且有两个整数平方根:5和-5。调用函数`check_number(16)`将返回False,因为16是一个完全平方数,但只有一个整数平方根:4。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值