932 2025

Problem 932

今年是 2025 年,对于这个数字,满足 给定两个正整数 ,如果连接起来得到 (不是相乘)满足 ,那么就是一个 2025 数。

3025 和 81 也满足这个条件。注意 9801 并不是,因为 98 和 1 连接起来是 981 而不是 9801。

表示小于等于 个数字且是 2025 数的数之和。。求

数的长度是 16 为,根有 8 位,可以遍历,只要确定 root 及其 square 是不是 2025 数足够快。

假定给定一个数字 ,就是这里的 root,计算得到 square,然后分成两个数。然后看其和的平方是不是等于 root。假定 root 这个数有 位,那么 square 要么是 位,要么是 。如果是前者,只有一种划分方式,如果是后者,有两种。切分完之后,很容易得到实现一个函数判断一个数是否是 2025 数。这里要兼顾 9801 这种情况,也就是划分的第二个数的首个数字不能是零。

private static bool Is2005Number(long root, long square)
{
    string s = square.ToString();
    int length = s.Length % 2 == 0 ? 1 : 2;
    for (int i = s.Length / 2; i < s.Length / 2 + length; i++)
    {
        if (s[i] == '0')
        {
            continue;
        }

        long first = long.Parse(s[..i]);
        long second = long.Parse(s[i..]);

        if (first + second == root)
        {
            return true;
        }
    }

    return false;
}
将近 10s 能够得到结果。仔细看代码,其实计算 first second 两个数不用真的切分字符串然后从子串中 Parse,可以从 square 这个数通过除法和取模得到。
static readonly long[] POW = [ 1, 10, 100, 1_000, 10_000, 100_000,
                               1_000_000, 10_000_000, 100_000_000 ];

long first = square / POW[s.Length - i];
long second = square % POW[s.Length - i];
这样将近 4s 可以得到结果。