鱼C论坛

 找回密码
 立即注册
查看: 920|回复: 6

[学习笔记] 关于29讲动动手001:这两段代码作出相同输入,有可能返回不一样结果吗?

[复制链接]
发表于 2025-3-12 15:58:02 | 显示全部楼层 |阅读模式
10鱼币
s = input('')
   
n = len(s)
for i in range(1, n//2+1):
    if n % i == 0:
        if s.startswith(s[i:i*2]) and s.count(s[i:i*2]) == n/i:
            print(True)
else:
    print(False)


上下两段代码,在作出相同输入的情况下,有可能返回不一样的结果吗?

s = input('')
   
n = len(s)
for i in range(1, n//2+1):
    if n % i == 0:
        if s.count(s[i:i*2]) == n/i:
            print(True)
else:
    print(False)

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-3-12 15:58:16 | 显示全部楼层
你的两段代码在相同输入的情况下,确实有可能返回不一样的结果。让我们分析一下它们的区别:

第一段代码:
  1. startLine: 2
  2. endLine: 10
复制代码

在 `if` 语句中包含了 `s.startswith(s)`,但 `s.startswith(s)` 永远为 `True`,因为 `s` 一定是以 `s` 开头的,所以这个条件没有实际作用。

第二段代码:
  1. startLine: 12
  2. endLine: 18
复制代码

去掉了 `s.startswith(s)`,但仍然保留了 `s.count(s) == n / i` 这个条件。

### 关键问题:
`s.count(s) == n / i` 这个条件是错误的,因为 `s.count(s)` 只会返回 `1`(`s` 在 `s` 中出现的次数是 1),而 `n / i` 可能是其他值,所以这个条件几乎总是 `False`,导致第二段代码不会输出 `True`,而第一段代码可能会(尽管 `s.startswith(s)` 没有实际作用)。

### 结论:
两段代码在相同输入下,可能会返回不同的结果。第二段代码基本上不会输出 `True`,而第一段代码在某些情况下可能会。

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

使用道具 举报

 楼主| 发表于 2025-3-13 10:34:33 | 显示全部楼层
@FishC
具体是输入什么相同的内容,会出现不一样的结果?请具体列出输出的相同内容
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-3-13 10:36:45 | 显示全部楼层
ioriqq123 发表于 2025-03-13 10:34
@FishC
具体是输入什么相同的内容,会出现不一样的结 ...


Could you clarify which programming language or context you're referring to? Are you asking about non-deterministic behavior in a program, such as when using random number generation, multi-threading, or floating-point calculations? Let me know the details, and I'll be happy to help!

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

使用道具 举报

发表于 2025-3-14 20:43:11 | 显示全部楼层
这个AI 回复的是不是不太对
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-3-22 18:52:44 | 显示全部楼层
本帖最后由 HuangBin2025 于 2025-3-22 18:56 编辑

输入相同,不会返回不一样的结果。在 `if` 语句中包含了 `s.startswith(s[i:i*2])`,但 `s.startswith(s[i:i*2])` 永远为 `True`,因为 `s[i:i*2]` 一定是以 `s` 开头的,所以这个条件没有实际作用。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-4-5 16:03:41 | 显示全部楼层
这两段代码不会产生不同的结果吧~~



在第一个代码中,判断条件是

  1. if s.startswith(s[i:i*2]) and s.count(s[i:i*2]) == n/i:
复制代码

其中,s.startswith(s[i:i2]) 确保了待检测的子串就是字符串开头的那一段;

而 s.count(s[i:i2]) == n/i 则要求这个子串在整个字符串中正好出现 n/i 次,也就是整个字符串可以分割成 n/i 个相同的部分。

在第二个代码中,仅判断

  1. if s.count(s[i:i*2]) == n/i:
复制代码

但实际上,如果 s.count(s[i:i2]) 恰好等于 n/i,这意味着整个字符串正好由这种长度为 i 的子串拼接而成,此时必然有 s.startswith(s[i:i2]) 为真。

因此,对于任何给定的输入,如果第二段代码的条件满足(也就是打印 True),那么第一段代码中的 s.startswith 条件一定也满足;

反之亦然。所以这两段代码在相同输入下返回的结果是一样的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 23:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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