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

本题要求实现一个函数,判断任一给定整数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

正确版本

int IsTheNumber(const int N) {
	//判断N是否是完全平方数
    int tmp = sqrt(N);
    if ((tmp * tmp) != N)
        return 0;
    //如果N可以开根号,那就判断是否有重复的数字
    else
    {
        int flag[10] = { 0 }, a;
        int m = N;
        while (m) {
            a = m % 10;
            m = m / 10;
            if (flag[a])return 1;
            else 
                flag[a] = 1;
        }
        return 0}
}

解释说明

分为两部分,是否是完全平方数和是否有重复数字。

是否是完全平方数:如果是完全平方数,那它开根没有小数。这就好办了,使用math.h里的开根函数sqrt(),它的原型是double sqrt(double x);,返回值是double型的,转换成int型就可以去掉小数。再通过平方值的比较,就能挑选出完全平方数。

是否有重复数字:创建一个标志数组flag[10],用来记录出现的数字。除10取模后的数字就是最后一位数字,例如144%10会得到4,这正是144的最后一位数字,然后标记flag[4]=1。循环后的14.4取模为4,这与上个记录冲突,返回1。

如果上述方案有不妥或是你有更好的方案,还望不吝赐教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章