所谓自守数(也称守形数),是指其平方数的低位部分恰为该数本身的自然数。例如: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 是否是自守数:
-
先求出 25 的平方,即 625;
-
将 25 和 625 用十进制表示,得到 25 和 625;
-
检查 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;
}