解题思路
要解决这个问题,首先需要明确拆分规则和和为偶数的条件,再逐一枚举所有可能的拆分方式并验证。
一、核心定义与规则
拆分定义:
将数字103(三位数)在数位之间插入分割点,分成两个非空数字串(允许前导 0,即拆分后的部分可以 0 开头,如0和103)。三位数有且仅有 2 个拆分位置:
- 位置 1:拆在第 1 位和第 2 位之间(如1和03);
- 位置 2:拆在第 2 位和第 3 位之间(如10和3)。
- 和为偶数的条件:两个数的和为偶数,当且仅当这两个数同奇同偶(均为奇数或均为偶数)。(奇数 + 奇数 = 偶数,偶数 + 偶数 = 偶数,奇数 + 偶数 = 奇数)。
二、枚举所有拆分方式并验证
- 拆分位置 1:拆成 a=1 和 b=03(数值为 3) a=1(奇数),b=3(奇数); 奇偶性相同,和为 1+3=4(偶数),满足条件。
- 拆分位置 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()