解题思路

这是一个自守数统计问题。自守数是指一个数的平方的尾数等于该数本身。例如:

  • 25^2 = 625,末尾是25
  • 76^2 = 5776,末尾是76
  • 9376^2 = 87909376,末尾是9376

关键点

  1. 数据范围:
  2. 需要统计 以内的自守数个数
  3. 判断一个数是否为自守数的方法:
    • 计算该数的平方
    • 取平方数的末尾几位
    • 与原数比较

代码

#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

算法及复杂度

算法分析

  1. 遍历过程:

    • 从0到 遍历每个数
    • 对每个数判断是否为自守数
    • 统计自守数的个数
  2. 判断自守数:

    • 计算平方数
    • 转换为字符串比较末尾
    • 使用字符串操作简化比较过程

复杂度分析

  • 时间复杂度: - 需要遍历从0到 的每个数
  • 空间复杂度: - 只需要常数级的额外空间