并非所有参数都在字符串格式化期间转换(证明 Collat​​z 猜想)

Not all arguments converted during string formatting (Proving Collatz Conjecture)

当我 运行 下面的代码时出现错误。我在 Whosebug 上看过这里,但最终没有解决我的问题。

print "insert value"
value = raw_input ()

flag = False
i = 0

while flag:
    if value == 1:
        flag = True
    elif value % 2 == 0:
        value = value / 2
    else:
        value = value * 3
        value = value + 1
    i = i + 1

print "After", i, "attempts the conjecture has been demonstrated"

我在 elif 逻辑测试 value% 2 == 0 中收到一个错误

not all arguments converted during string formatting

我认为问题出在变量类型上,但我尝试了 input 函数并强制使用 int 类型 value = int (input (....)),但这也没有用。

在 IDLE 中这对我有用

value = int(raw_input ())

将原始输入转换为整数

while True:
    if value == 1:
        break
    elif value % 2 == 0:
        value = value / 2
    else:
        value = value * 3
        value = value + 1
    i = i + 1

没有任意标志的更简单的方法

iScrE4m 已经展示了如何修复你的程序,但我会解释你为什么得到那个

TypeError: not all arguments converted during string formatting

错误信息。

当 Python 解释器在字符串后看到 % 时,它会将 % 解释为 string interpolation operator,用于转换数据并将其插入字符串.

例如

a = 2
b = 3
print "%d + %d = %d" % (a, b, a + b)

输出

2 + 3 = 5

在您的代码中,value 是一个字符串,因此解释器尝试对 value % 2 进行字符串插值,但随后发现 value 不是要格式化的有效格式字符串数据 2,所以它给你 TypeError

在现代代码中,不鼓励使用 % 风格的字符串格式,而首选 str.format 方法。等价于上面的例子是:

print "{0} + {1} = {2}".format(a, b, a + b)

在 Python 2.7 及更高版本中,您可以省略字段编号:

print "{} + {} = {}".format(a, b, a + b)

我对你的代码还有一些意见。

在 Python 中调用函数时,通常 而不是 在函数名称后放置 space。

在调用 raw_input 之前无需使用 print 打印提示:您可以(并且应该)将提示作为参数提供给 raw_input.

执行整数除法时,您应该使用整数除法运算符//。单个斜线在 Python 2 中工作正常,但在 Python 3 中它不会像预期的那样工作,因为它将执行浮点除法。例如,10 / 2 将导致 5.0

当您需要对一个变量执行单个操作并将该操作的结果保存回同一个变量时,您可以使用扩充赋值运算符。例如,
而不是 i = i + 1 你可以写 i += 1;
而不是 value = value // 2 你可以写 value //= 2.

此外,而不是

value = value * 3
value = value + 1

可以

value *= 3
value += 1

但是,当对一个变量执行多个操作时,在一行中执行它们会更加紧凑和高效。所以更常见的做法是:

value = value * 3 + 1

综上所述,这是您的代码的重新设计版本。

value = int(raw_input("Enter value: "))
i = 0
while True:
    if value == 1:
        break
    elif value % 2 == 0:
        value //= 2
    else:
        value = value * 3 + 1
    i += 1    

print "After {} attempts the conjecture has been demonstrated.".format(i)