【PAT基础题】6-7 统计某类完全平方数

本文介绍了一个编程问题,要求实现一个函数IsTheNumber,判断整数N是否既是完全平方数且至少有两个数字相同。给出了两种方法的代码实现,包括直接求平方根和利用公式验证。
摘要由CSDN通过智能技术生成

6-7 统计某类完全平方数

分数 20
作者 陈越
单位 浙江大学

本题要求实现一个函数,判断任一给定整数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、判断是否为完全平方数;(有三种方式)

  • 方法一:直接求平方根,判断开根号后是否为整数。
sqrt(x)==(int)sqrt(x)
  • 方式二:利用公式;
    1)先开方x取整,得到整数y;
    2)再计算y^2;
    3)判断是否等于x;
y=(int)sqrt(x);
if(x==y*y)
  • 方法三:利用性质;
    1)完全平方数末尾只能是0、1、4、5、6、9(不能是2、3、7、8);
    2)如果末尾是,再对其进行平方运算,看看是否等于原函数。

2、至少有两位数字相同;

1、利用数组记录0~9出现的次数;
2、判断出现次数,大于等于2的,则出现两位数字相同的。

代码如下(方式一):

int IsTheNumber(const int N)
{
    int a[10]={0};//定义数组
    int x,p,flat=0;
    x=N;
    //方法一: 直接求平方根,判断开根号后是否为整数。
    if(sqrt(x)==(int)sqrt(x))//判断是否为完全平方数;
    {
        while(x){//用数组记录0~9出现次数;
            p=x%10;//%求余符号,比如7%3=1,表示7除以3,余下1;
            a[p]++;
            x/=10;
        }
        for(int i=0;i<10;i++){//循环遍历数组,是否有两位数字相同
            if(a[i]>=2){//有两位数字相同,退出循环,并返回1,
                flat=1;//标记flat是为了方便判断没有两位数字相同
                return 1;
            }
        }
        if(flat==0)//没有两位数字相同
            return 0;
    }else{
        return 0;
    }
}

代码如下(方式二):

int IsTheNumber(const int N)
{
    int a[10]={0};
    int x,y,p,flat=0;
    x=N;
    y=(int)sqrt(x);
    if(x==y*y)
    {
        while(x){
            p=x%10;
            a[p]++;
            x/=10;
        }
        for(int i=0;i<10;i++){
            if(a[i]>=2){
                flat=1;
                return 1;
            }
        }
        if(flat==0)
            return 0;
    }else{
        return 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值