📜  所有不包含0且可被9整除的N位回文数的总和(1)

📅  最后修改于: 2023-12-03 14:54:26.123000             🧑  作者: Mango

所有不包含0且可被9整除的N位回文数的总和

这个问题可以用数学方法来解决。回文数的特点是左半部分等于右半部分的倒序,由此可以得到回文数的一般形式:

a[num-1] a[num-2] ... a[1] a[0] a[1] ... a[num-2] a[num-1]

其中,a[0] ~ a[num-1] 表示回文数的 N 个数位,中间的 “...” 表示省略的数位。为了让回文数不包含 0,我们可以让 a[0] 取 1 ~ 9 中的一个数,其余各数位取 0 ~ 9 中的任意数。

一位数的情况下,只有 9 是 9 的倍数;两位数的情况下,有 $9 \times 10$ 个回文数,其中 $10 \times 1$ 个是 9 的倍数;三位数的情况下,有 $9 \times 10 \times 10$ 个回文数,其中 $10 \times 10 \times 1$ 个是 9 的倍数。以此类推,N 位回文数中,共有 $9 \times 10^{N-1}$ 个回文数,其中 $10^{N-1}$ 个是 9 的倍数。

所以,不包含 0 且可被 9 整除的 N 位回文数之和为:

sum = 9 * 10^{N-1} * (1 + 2 + ... + 10^{N/2-1})

下面是 Python 代码片段:

num = int(input("请输入回文数的位数:"))
if num % 2 == 0:
    count = 10 ** (num // 2 - 1)
    result = 45 * count * (count + 1)
else:
    count = 10 ** ((num - 1) // 2)
    result = 45 * count * (count + 1) // 10 * 9
print("总和为:", result)

其中,count 表示 N 位回文数的一半的位数(向下取整),result 表示总和。如果 N 是偶数,count 表示 N/2-1 位回文数的一半的位数,由于每个回文数可以看成由两个 count 位数字组成,所以有 10^count 个可选的数字。如果 N 是奇数,count 表示 (N-1)/2 位回文数的一半的位数,此时需要乘上 9/10,原因是这些回文数中只有 9 的奇数倍是可行的。