PAT基础编程题目集——6-7 统计某类完全平方数

版权声明:余生请多指教,欢迎交流学习: https://blog.csdn.net/LYS20121202/article/details/83036282

原题目:

本题要求实现一个函数,判断任一给定整数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.要满足题设的两个条件:1).完全平方数,2).至少有两位相同,初次初次看到题目时,直接想到的就是暴力1-√n判断,看了网上几个帖子后,我们可以使用sqrt(),然后强制类型转换为int,再平方后看是否相等即可,这到是一个不错的方法,时间消耗很少。对于至少两位相同,我使用对于它的每一位都保存到H[10]里面,数组初始值为0,数组下标代表当前这一位数,值表示个数,最后判断只要一个数组下标的值大于1即可(根据初始值的不同,判断条件不同)。最后在两者同时成立情况下,该正整数满足条件,返回1

2.代码还是之前暴力的代码,没有修改,既然可以过,那就AC吧,

代码:

int IsTheNumber ( const int N )
{
    //i ,j 为标记,当两者情况同时成立时,即都为1 则返回1
    int i=0,j=0,k,n;
    int H[10];
    //初始数组为0,用来存取每个数字出现的个数
    for(k=0;k<10;k++)
    {
        H[k]=0;
    }
    //暴力判断是否为完全平方数
    for(k=0;k<=N;k++)
    {
        if(k*k==N)
        {
            i=1;
            break;
        }
    }
    //取每一位并保存个数
    for(n=N,k=n%10;n!=0;k=n%10)
    {
        H[k]++;
        n=n/10;
    }
    //对于个数大于1的,即存在至少有两位相同,
    for(k=0;k<10;k++)
    {
        if(H[k]>1)
        {
            j=1;
            break;//存在后,直接跳出循环,无需判断之后的情况
        }
    }
    //对于同时满足这两种情况的返回1 否则,返回0
    if(i==1&&j==1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

猜你喜欢

转载自blog.csdn.net/LYS20121202/article/details/83036282
今日推荐