连接 1 和 N 之间的数字,看看它是否能被 3 整除

问题描述

我正在尝试制作一个基本上像这样工作的程序: 我要一个数字,从这个数字我必须把 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