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

本文旨在讲解统计某类完全平方数例题!

在进行结题之前首先得了解什么是完全平方数!

完全平方数的定义是:如果一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。

下面来看一下本例题的题目以及要求!

函数接口定义:

 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

代码长度限制                                16 KB

时间限制                                        400 ms

内存限制                                        64 MB

下面根据题目要求来写出函数的实现!

int IsTheNumber(const int N)
{
    int n = N;
    int arr[10] = { 0 };       //arr数组用来统计一个数的次数!
    //int s = sqrt(N);   if(s*s==N)  利用sqrt来判断一个数是否为完全平方数!
    for (int i = 1; i < n; i++)//进行循环判断该数符合完全平方数的定义
    {                           
        if (pow(i, 2) == n)    //i为完全平方数!
        {
            while (n)
            {
                {
                    arr[n % 10]++;    //arr[i],i表示余数,如果出现相同余数的情况下,该地址的元素则会进行+1操作
                    n/= 10;
                }
            }
        }
    }
    for (int i = 0; i < 10; i++)     //因为余数的取值为0~9,循环结束为i<10!
    {
        if (arr[i] > 1)        //只要满足数组中的元素大于1,即可以判断出现相同的余数啦!
        {
            return 1;
        }
    }
    return 0;
}

解决本题的思路可以简单分为两大步!

一、首先先判断一个数是否是完全平方数 !

二、再进行判断是否有两个相同的数字!

判断一个数是否为完全平方数可以利用math.h函数!因为例题中主函数也引用了math.h函数,所以我们可以直接在函数中使用这个函数!

math.h函数中的pow可以求出一个数的完全平方数,只需将pow(m,n),中的n赋值为0,进行for循环就可以求出其完全平方数啦!

也可以利用math.h库函数中的sqrt函数直接判断是否存在完全平方数!下面是sqrt函数的使用方式!

double sqrt(double x);

作用:
sqrt() 用来求给定值的平方根

判断一个数是否为完全平方数后,就可以判断是否存在两个相同的数字啦!

可以创建一个大小为10的整形数组,用来存储余数!一开始初始化全部为0,数组下标即为余数!arr[i],当一开给定的数字N不为0时,一直进行模10除10操作!只要循环不停止一直进行arr[N%10]++;

当数字N的每位数字都求出来以后,最后再进行遍历数组!若数组中的元素存在>1的情况下,则可以证明存在至少有两位数字相同!

好啦,今日分享到此为止!如果还有不懂的小伙伴们可以在评论区留言哦!

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值