解题思路

要解决这个问题,首先需要明确拆分规则和和为偶数的条件,再逐一枚举所有可能的拆分方式并验证。

一、核心定义与规则

拆分定义:

将数字103(三位数)在数位之间插入分割点,分成两个非空数字串(允许前导 0,即拆分后的部分可以 0 开头,如0和103)。三位数有且仅有 2 个拆分位置:

  • 位置 1:拆在第 1 位和第 2 位之间(如1和03);
  • 位置 2:拆在第 2 位和第 3 位之间(如10和3)。
  • 和为偶数的条件:两个数的和为偶数,当且仅当这两个数同奇同偶(均为奇数或均为偶数)。(奇数 + 奇数 = 偶数,偶数 + 偶数 = 偶数,奇数 + 偶数 = 奇数)。

二、枚举所有拆分方式并验证

  1. 拆分位置 1:拆成 a=1 和 b=03(数值为 3) a=1(奇数),b=3(奇数); 奇偶性相同,和为 1+3=4(偶数),满足条件。
  2. 拆分位置 2:拆成 a=10 和 b=3 a=10(偶数),b=3(奇数); 奇偶性不同,和为 10+3=13(奇数),不满足条件。 三、结果统计 只有 1 种 拆分方式满足条件。 最终答案 1

超时代码

import sys

# for line in sys.stdin:
#     a = line.split()
#     print(int(a[0]) + int(a[1]))
def solution():

    n =int(input())
    s=str(n)
    #  [1,0,3]
    s_len=len(s)
    res=0
    for i in range(1,s_len):
        #print(s[0:i],s[i:])
        a=int(s[0:i])
        b=int(s[i:])
        a_r =a%2
        b_r=b%2
        if (a_r ==0 and  b_r==0)  or(a_r==1 and b_r==1):
            res+=1
    print(res)

solution()
  • 当前代码中,将子串转为整数(int(s[0:i])和int(s[i:]))的操作可以简化。因为一个数的奇偶性仅由其最后一位决定,无需转换整个子串:
  • 前半部分a的奇偶性 = 子串s[0:i]最后一位的奇偶性(即s[i-1]的奇偶性);
  • 后半部分b的奇偶性 = 子串s[i:]最后一位的奇偶性(即s[-1]的奇偶性)。
import sys

# for line in sys.stdin:
#     a = line.split()
#     print(int(a[0]) + int(a[1]))
def solution():

    n =int(input())
    s=str(n)
    #  [1,0,3]
    s_len=len(s)
    res=0
    for i in range(1,s_len):
        #print(s[0:i],s[i:])
        #a=int(s[0:i])
        a=int(s[i-1])
        b=int(s[-1])
        a_r =a%2
        b_r=b%2
        if (a_r ==0 and  b_r==0)  or(a_r==1 and b_r==1):
            res+=1
    print(res)

solution()

优化后可避免大整数转换,提高效率(尤其对超长数字字符串)。 避免大整数转换:直接处理输入字符串,通过子串的最后一位判断奇偶性,节省转换时间; 固定后半部分奇偶性:后半部分的最后一位是原数的最后一位(n[-1]),其奇偶性可提前计算,避免重复判断; 边界处理:若数字长度小于 2(无法拆分),直接返回 0。 优化后代码的时间复杂度仍为O(k)(k为数字位数),但常数项更小,尤其适合处理超长数字(如10^1000这类字符串)。

import sys

# for line in sys.stdin:
#     a = line.split()
#     print(int(a[0]) + int(a[1]))
def solution():

    #n =int(input())
    n =sys.stdin.readline().strip() # 直接读取字符串避免整数转换
    s=str(n)
    #  [1,0,3]
    s_len=len(s)
    res=0
    # 长度小于2 无法拆分
    if  s_len<2:
        print(0)
        return
    # 后半部分固定为 最后一位
    b_last=int(n[-1])%2
    for i in range(1,s_len):
        #print(s[0:i],s[i:])
        #a=int(s[0:i])
        a_last=int(s[i-1]) %2 # 前半部分的最后一位
        #b=int(s[-1])
        if a_last==b_last:
            res+=1
    print(res)

solution()

alt