我无法正确解决计算机科学统一国家考试中的问题,老师们拒绝帮助,我不明白为什么解决方案是错误的,我将在下面给出我的代码和问题陈述,请解释我错在哪里,提前谢谢! (与 KompEGE 一起完成的任务,我将文件附加到下面的任务中)
#17685 重拍 04.07.24(等级:棺材)
文本文件由十进制数字、“+”和“*”符号(加法和乘法)组成。确定连续序列中的最大字符数,该序列是具有非负整数(无符号)的有效算术表达式,其值为零。在这个表达式中,没有两个算术运算符号彼此相邻;运算顺序由数学规则决定。数字符号中没有不重要的(前导)零。 24.txt
答案 169
请注明您答案的字符数。
s = open("24_17641.txt").read()
while "**" in s or "++" in s or "*+" in s or "+*" in s:
if "**" in s:
s = s.replace("**", "* *")
if "++" in s:
s = s.replace("++", "+ +")
if "*+" in s:
s = s.replace("*+", "* +")
if "+*" in s:
s = s.replace("+*", "+ *")
s = s.split()
print(s)
a = [i[1:-1] for i in s if i != "+" and i != "*"]
a = a[1:-1]
mx = 0
for i in a:
if eval(i) == 0:
mx = max(mx, len(i))
print(mx)
我用表达式调用了你的解决方案
0*0+1*1,得到了答案0。表达式的正确答案是 30*0。算法错误。解决方案之一:
读取文件,删除末尾的换行符和文本末尾和开头的操作符号:
f.read().strip('\n+*')。将文件拆分为不包含连续多个运算符号的子字符串:
re.split('[+*]{2,}', text)。将每个子字符串分解为以下项:
e.split('+')。比较每一项与零:
'*0*' in '*' + term + '*'。将零项(和非零项)收集到组中:
itertools.groupby。从每一组中恢复表达式:
'+'.join(g)。如果在该组之前有另一个以 结尾的组,则
0将该组的长度加 2:12340+0→0+0。从所有零和的组中,选择最长的一个:
max_length = max(max_length, length)。步骤 1:将序列分解为有效的算术表达式:
第 2 步:将每个实数表达式分成其算术加法分量(使用 + 号)。每组都是数字和乘号 (*) 的组合。
步骤 3:将每个乘法组分成单独的数字(使用 * 符号)。步骤 4:检查是否至少有一个数字为 0。
步骤 5:追踪最长的线。
步骤6:打印长度。更新:我没有意识到零序列可以是非零序列的子序列。因此需要纠正步骤 4 来检查这一点。
此外,可以从非零数字中“窃取”最后的零。例如,在
12340+567*0最大序列中,零序列为0+567*0。因此修正后的代码如下:
更新:可以进行一些优化,但会降低可读性: