问题描述
我正在尝试制作一个基本上像这样工作的程序: 我要一个数字,从这个数字我必须把 1 和 N 之间的所有数字连接起来形成一个数字 N。例如,如果我输入 12,数字 N 将是 123456789101112,或者如果我输入 6,则数字将是 123456。一旦形成 N,如果 N 可以被 3 整除,我必须在屏幕上返回“YES”,否则我必须在屏幕上返回“NO”。
这就是我所拥有的:
n = int(input("Enter a number:"))
for x in range (n + 1):
if(n%3==0):
print("YES")
else:
print("NO")
我刚开始使用 Python,我不知道我做错了什么,如果有人能帮我一把,我将不胜感激!
解决方法
答案是:
if n%3 != 1:
print("YES")
else:
print("NO")
原因
每个数字都是 (3*k+1)
、(3*k+2)
或 (3*k)
三种类型之一。如果一个数的数字之和能被 3 整除,则该数能被 3 整除。它是 (3*k)
类型的数。
如果输入是 1。那么 N 就是 1,这是一个 (3*k+1)
类型的数字,所以它不能被 3 整除。
当输入为 2 时,N 为 12,可被 3 整除。
当输入为 3 时,N 为 123,可被 3 整除。
同理,当输入为 4 时,N 为 1234,不能被 3 整除。
如果你选择一个,你会发现只要输入不是 (3*k+1)
类型的数字,N 就会被 3 整除。
这是一种可能的解决方案。它展示了如何测试 0xFFFFFFFF
输入和 n
连接值
val
,
如果你想用你描述的算法来做,那么一个简单(但不是很快)的方法是这样的:
n = int(input("Enter a number:")) # get the number
stringNumber = ""
for x in range(1,n+1):
stringNumber += str(x) # join the string version of numbers 1...n into a string
intNumber = int(stringNumber) # convert the string concatenation into an int
if (intNumber % 3 == 0): # check if the int is divisible by 3
print("YES")
else:
print("NO")
如果您愿意,您可以使用 join()
来加速字符串连接:
stringNumber = "".join([str(digit) for digit in range(1,n+1)])
结果是一样的
但是,您可能还会注意到,如果一个数字的数字之和可被 3 整除,则该数字可被 3 整除,因此您可以使用如下算法:
n = int(input("Enter a number:")) # get the number
sumOfDigits = sum([digit for digit in range(1,n+1)]) # sum numbers 1...n
if (sumOfDigits % 3 == 0): # check if the int is divisible by 3
print("YES")
else:
print("NO")
,
您也可以编写一个带有列表推导式的单行第三级操作来执行此操作。
def check():
n = int(input("Enter a number:"))
return 'Yes' if int(''.join([str(i) for i in range(1,n+1)]))%3==0 else 'No'
check()
Enter a number:12
'Yes'
,
使用范围生成从 1 到 N 的数字,将它们转换为字符串并连接它们:
x = 12
N = int("".join(map(str,range(1,x+1))))
div3 = N%3 == 0
print("Is",N,"divisible by 3?",["NO","YES"][div3])
# Is 123456789101112 divisible by 3? YES