PTA 6-7 统计某类完全平方数 (20 分)

这篇博客讨论了如何编写一个函数,用于检查一个整数是否既是完全平方数且至少有两位数字相同。两种不同的实现方法被提出,一种通过拆分数字并比较,另一种通过计数数字出现的频率。函数在给定范围内对满足条件的整数进行计数,并给出了一个测试用例的输入和输出示例。
摘要由CSDN通过智能技术生成

本题要求实现一个函数,判断任一给定整数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. 将数字中的位数拆开放入数组,个位数 N % 10,十位数 N / 10 % 10,百位数 N / 10 / 10 % 10,以此类推
  2. 比较数组中的数字是否有相同
  3. 如果有相同的数字,那么继续判断是否是完全平方数 int y = x * x; if (y == N)
  4. 如果是,返回 1。如果不是,返回 0
int IsTheNumber ( const int N ) {

    int arr[10] = {0}; // 不超过 int 存储的最大值
    int count = 0;
    int num = N; // 需要对 N 进行修改,所以赋值给 num

    // 个位数 N % 10,十位数 N / 10 % 10,百位数 N / 10 / 10 % 10,以此类推
    // 只剩个位数时就是最高位的值
    while(num >= 10) {

        arr[count++] = num % 10;
        num /= 10;

    }

    arr[count] = num; // 将最高位的值存储到数组中

    int x = sqrt(N); // 将 N 开根号
    int y = x * x; // 计算 x 的平方,与 N 值进行判断是否为完全平方数

    // 使用 count 作为循环次数,可以只取到我们将 num 拆开的值
    for (int i = 0; i <= count; i++) {

        // 数组中的值进行比较,第一个和第二个比,以此类推
        for (int j = i+1; j <= count; j++) {

            // 当有相同的值时进入判断,满足至少两位数字相同
            if (arr[i] == arr[j]) {

                // 属于完全平方数
                if (y == N) {
                    return 1;
                } else {
                    return 0;
                }

            }

        }
    }

    return 0;

}

做法二

  1. 判断数字是否是完全平方数
  2. 拆开数字中的个位数、十位数等作为数组下标
  3. 使用 arr[count]++; 如果元素的值超过 1,则代表有相同的数字
  4. 使用 for 循环遍历数组,寻找是否有元素的值超过 1,如果有的话,则返回 1
int IsTheNumber ( const int N ){

    int arr[10] = {0}; // 数字 0 - 9
    int count;
    int num = N; // 需要对 N 进行修改,所以赋值给 num

    int x = sqrt(N); // 将 N 开根号

    // 计算 x 的平方,与 N 值进行判断是否为完全平方数
    if(x*x == N){

        while(num){

            // 拆开数字中的个位数、十位数等作为数组下标
            // 例如 arr[3]++, arr[2]++, 又来一个 arr[3]++
            // 那么 arr[2] = 1, arr[3] = 2,超过 1 就代表有相同的数字
            count = num % 10;
            arr[count]++;
            num /= 10;
        }
        // 使用 count 作为循环次数,可以只取到我们将 num 拆开的值
        for (int i = 0; i < 10; i++) {

            // 如果数组中有元素的值超过 1,说明有完全平方数中有相同的数字
            if (arr[i] > 1) {
                return 1;
            }

        }
    }

    return 0;
  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值