鱼C论坛

 找回密码
 立即注册
查看: 48|回复: 1

[已解决]29讲动动手1题求讲解

[复制链接]
发表于 前天 11:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
s = input("请输入一个由字母构成的字符串:")
   
n = len(s)
for i in range(1, n//2+1):
    # 如果子字符串的长度为i,则n必须可以被i整除才行
    if n % i == 0:
        # 如果子字符串的长度为i,则i到i*2之间是一个重复的子字符串
        if s.startswith(s[i:i*2]) and s.count(s[i:i*2]) == n/i:
            print(True)
            break
# for...else的用法,小甲鱼希望大家还没有忘记哦^o^
else:
    print(False)

第29讲,当字符串为abacabac时,
i=1,n=8.
if s.startswith(s[i:i*2]) and s.count(s[i:i*2]) == n/i:
这个条件两边都不满足
不是应该直接打印False吗?
但是字符串应该是符合条件的
@FishC @小甲鱼
最佳答案
前天 11:47
鱼油你好!我来帮你分析一下这个代码的问题。

首先,你指出的情况确实存在:当字符串是 "abacabac" 时,代码错误地输出了 False,但它应该输出 True,因为这个字符串是由 "abac" 重复两次构成的。

代码中的问题出在这一行:
if s.startswith(s) and s.count(s) == n/i:

- s.startswith(s) 总是返回 True,因为任何字符串都以自身开头,所以这个条件没有实际意义。
- s.count(s) 计算的是整个字符串在自身中出现的次数,通常返回 1(除非有重叠部分),但 n/i 是重复次数(例如 n=8, i=2 时 n/i=4),所以 1 不等于 4,条件总是不成立。

因此,循环中所有可能的 i 都检查失败,最终执行 else 块输出 False。

正确的逻辑应该是:对于每个可能的子字符串长度 i(从 1 到 n//2),如果 n 能被 i 整除,则检查整个字符串是否由子字符串 s[0:i] 重复构成。修改后的代码如下:


  1. s = input("请输入一个由字母构成的字符串:")
  2. n = len(s)
  3. for i in range(1, n//2 + 1):
  4.     if n % i == 0:
  5.         # 获取子字符串并检查重复
  6.         substring = s[:i]
  7.         if s == substring * (n // i):
  8.             print(True)
  9.             break
  10. else:
  11.     print(False)
复制代码


这样,对于 "abacabac",当 i=4 时,子字符串是 "abac",重复两次正好等于原字符串,所以会输出 True。

希望这个解释对你有帮助!如果还有疑问,欢迎继续讨论。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 11:47 | 显示全部楼层    本楼为最佳答案   
鱼油你好!我来帮你分析一下这个代码的问题。

首先,你指出的情况确实存在:当字符串是 "abacabac" 时,代码错误地输出了 False,但它应该输出 True,因为这个字符串是由 "abac" 重复两次构成的。

代码中的问题出在这一行:
if s.startswith(s) and s.count(s) == n/i:

- s.startswith(s) 总是返回 True,因为任何字符串都以自身开头,所以这个条件没有实际意义。
- s.count(s) 计算的是整个字符串在自身中出现的次数,通常返回 1(除非有重叠部分),但 n/i 是重复次数(例如 n=8, i=2 时 n/i=4),所以 1 不等于 4,条件总是不成立。

因此,循环中所有可能的 i 都检查失败,最终执行 else 块输出 False。

正确的逻辑应该是:对于每个可能的子字符串长度 i(从 1 到 n//2),如果 n 能被 i 整除,则检查整个字符串是否由子字符串 s[0:i] 重复构成。修改后的代码如下:


  1. s = input("请输入一个由字母构成的字符串:")
  2. n = len(s)
  3. for i in range(1, n//2 + 1):
  4.     if n % i == 0:
  5.         # 获取子字符串并检查重复
  6.         substring = s[:i]
  7.         if s == substring * (n // i):
  8.             print(True)
  9.             break
  10. else:
  11.     print(False)
复制代码


这样,对于 "abacabac",当 i=4 时,子字符串是 "abac",重复两次正好等于原字符串,所以会输出 True。

希望这个解释对你有帮助!如果还有疑问,欢迎继续讨论。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-1 01:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表