7-77 寻找自守数

所谓自守数(也称守形数),是指其平方数的低位部分恰为该数本身的自然数。例如:252=625,因此25是自守数。(注:0 和 1 也算自守数。)

请编写程序,输出指定范围内的所有自守数。若指定范围内不存在自守数,则输出None。

输入格式

正整数 a 和 b, 且 a≤b≤10000

输出格式

若 [a,b] 内存在自守数,则按由小到大的顺序输出,每行输出一个自守数;若不存在自守数,则输出None。

输入样例1

10 80

输出样例1

25
76

输入样例2

400 600

输出样例2

None

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

思路:

判断自守数:

设给定数字为 num,令 square = num * num,即求该数的平方。如果 num 是 k 位数,那么它的平方 square 最多为 2k 位数(例如 k=3 时 num 的平方最长可以是 6 位数)。如果 num 的平方长度超过了 2k 位数,那么 num 不可能成为自守数。举个例子:当 num = 25 时,它的平方为 625,因此我们检查 5 和 25 的个位、十位是否相等,结果为相等,因此 25 是自守数。在这种情况下,num 和 num 的平方正好都是两位数。另一方面,如果 num = 11,则它的平方为 121,如果我们检查 1 和 11 的个位和十位是否相等,结果都不相等,因此 11 不是自守数。在这种情况下,num 是两位数,但 num 的平方是三位数。检查数 num 是否是 square 的末 k 位数,如果是,则这个数字是自守数。否则,不是自守数。

举个例子,假设我们要判断数字 25 是否是自守数:

  1. 先求出 25 的平方,即 625;

  2. 将 25 和 625 用十进制表示,得到 25 和 625;

  3. 检查 25 是否是 625 的末两位数,结果是正确的,因此 25 是自守数

定义一个函数 isAutomorphic,判断给定数字是否为自守数。 如果是,返回1;否则返回0。我们从 a 开始遍历到 b,对每个数字调用 isAutomorphic 函数来检查它是否是自守数。我们从 a 开始遍历到 b,对每个数字调用 isAutomorphic 函数来检查它是否是自守数。如果没有找到任何自守数,则打印 None。

代码:

#include <stdio.h>
// 判断是否为自守数
int isAutomorphic(int num)
{
    int square = num * num; // 计算 num 的平方

    while (num != 0)
    {
        if (num % 10 != square % 10) // 如果数位不同,说明不是自守数
            return 0;

        num /= 10; // 把 num 往右移一位
        square /= 10; // 把 num 的平方往右移一位
    }

    return 1; // 否则是自守数
}

int main()
{
    int a, b;
    int count = 0; // 计数器,计算自守数的个数

    // 输入指定的区间端点 a 和 b
    scanf("%d %d", &a, &b);

    // 遍历 [a,b] 区间内的所有整数,查找自守数
    for (int i = a; i <= b; i++)
    {
        if (isAutomorphic(i))
        {
            printf("%d\n", i);
            count++;
        }
    }

    // 如果没有找到任何自守数,则输出 None。
    if (count == 0)
        printf("None");

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾乃宇宙欠债王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值