解题思路
这是一个自守数统计问题。自守数是指一个数的平方的尾数等于该数本身。例如:
- 25^2 = 625,末尾是25
- 76^2 = 5776,末尾是76
- 9376^2 = 87909376,末尾是9376
关键点
- 数据范围:
- 需要统计
以内的自守数个数
- 判断一个数是否为自守数的方法:
- 计算该数的平方
- 取平方数的末尾几位
- 与原数比较
代码
#include <iostream>
#include <string>
using namespace std;
// 判断一个数是否为自守数
bool isSelfNumber(int n) {
// 计算n的平方
long long square = (long long)n * n;
// 转换为字符串便于比较末尾
string squareStr = to_string(square);
string numStr = to_string(n);
// 如果平方数的长度小于原数的长度,不可能是自守数
if (squareStr.length() < numStr.length()) {
return false;
}
// 比较末尾
return squareStr.substr(squareStr.length() - numStr.length()) == numStr;
}
int main() {
int n;
while (cin >> n) {
int count = 0;
// 统计0到n之间的自守数个数
for (int i = 0; i <= n; i++) {
if (isSelfNumber(i)) {
count++;
}
}
cout << count << endl;
}
return 0;
}
import java.util.*;
public class Main {
// 判断一个数是否为自守数
public static boolean isSelfNumber(int n) {
// 计算n的平方
long square = (long)n * n;
// 转换为字符串便于比较末尾
String squareStr = String.valueOf(square);
String numStr = String.valueOf(n);
// 如果平方数的长度小于原数的长度,不可能是自守数
if (squareStr.length() < numStr.length()) {
return false;
}
// 比较末尾
return squareStr.substring(squareStr.length() - numStr.length()).equals(numStr);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int count = 0;
// 统计0到n之间的自守数个数
for (int i = 0; i <= n; i++) {
if (isSelfNumber(i)) {
count++;
}
}
System.out.println(count);
}
}
}
def is_self_number(n):
# 计算n的平方
square = n * n
# 转换为字符串便于比较末尾
square_str = str(square)
num_str = str(n)
# 如果平方数的长度小于原数的长度,不可能是自守数
if len(square_str) < len(num_str):
return False
# 比较末尾
return square_str[-len(num_str):] == num_str
while True:
try:
n = int(input())
count = sum(1 for i in range(n + 1) if is_self_number(i))
print(count)
except:
break
算法及复杂度
算法分析
-
遍历过程:
- 从0到
遍历每个数
- 对每个数判断是否为自守数
- 统计自守数的个数
- 从0到
-
判断自守数:
- 计算平方数
- 转换为字符串比较末尾
- 使用字符串操作简化比较过程
复杂度分析
- 时间复杂度:
- 需要遍历从0到
的每个数
- 空间复杂度:
- 只需要常数级的额外空间