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

统计某类完全平方数

作者:yyyyzzz 、疯狂的SmileZ

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

解题思路

什么是完全平方数

完全平方指用一个整数乘以自己例如1乘1,2乘2,3乘3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。

解题方法:

判断当前函数接收到的数是否为完全平方数,可使用for循环+试乘法进行判断。本题给出了math库文件,也可直接使用函数判断是否为完全平方数。

for循环+试乘法

从1到N/2里面找一个数乘以本身等于N就是完全平方数,为什么要写N/2呢,因为如果这个数比自身的一半还大那么它的平方肯定大于了N这个数。(N/2可以换成sqrt(N))。

for(i=1;i<=N/2;i++)//判断是否为完全平方数
if(i*i==N) {是完全平方数}

sqrt函数+强制转换

因为sqrt()函数开根号出来是小数,因此我们要进行强制转换取整,取整后再相乘等于N的话就是完全平方数不是完全平方数的数开根号必然有非0的小数,取整后再相乘就会不等于N

如16 sqrt(16) = 4.0
如17 sqrt(17) =4.123
(int)sqrt(N)*(int)sqrt(N)==N

又有两位数字相同

判断该数是否至少有两位数相同,可以借用桶子思想,定义一个a[10]数组,然后利用循环取出每一个数,每取出一个数,就在数组相应数字位+1,只要数组有一个元素大于等于2,则满足要求。

因为数字是0-9,所以我们正好可以用到一个数组,运用下标来对其出现的次数进行统计。
在这里插入图片描述

方法一 for+试乘法

因为本题目需要同时满足两个要求,可定义一个flag,当满足一个条件时,flag就进行加一当执行完前面两个部分时,若flag等于二,则这个数满足题目要求。

int IsTheNumber ( const int N )
{
    int i,flag=0,a[10]={0},j=0;
    for(i=1;i<=N/2;i++)//判断是否为完全平方数
    if(i*i==N) {flag++;break;}
    for(i=N;i!=0;i=i/10)//取出每一位,并在数组中进行记录
    {
        a[i%10]++;
    }
    for(i=0;i<=9;i++)//判断0-9中是否有出现过两次或两次以上的数
    if(a[i]>=2) {flag++;break;  }
    if(flag>=2) return 1;//满足两个条件,该数符合题目条件,返回真
    return 0;
}

sqrt函数+强制转换

先用sqrt函数判断它是不是完全平方数,再统计这个数每个数字出现的次数,如果有一个数字出现的次数大于了2次就直接返回1,因为这个数满足了条件,否则就返回0。

int IsTheNumber ( const int N ) {
    if ((int)sqrt(N)*(int)sqrt(N) != N) {
        return 0;
    }
    int t = N;
    int p[10] = {0};
    while (t) {
        p[t%10]++;
        t=t/10;
    }
    for (int i = 0; i < 10; i++) {
        if (p[i] >= 2) {
            return 1;
        }
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值