使用python解决此问题涉及确保10,000,000和99,999,999之间的数字的所有单个数字均为1、2或3,并且如果这些数字也可以被18整除,则答案(win)是这两个数字的乘积条件是真的。
这是我到目前为止所拥有的:
count=10000000
win=0
yes=False
while(True):
def check():
i=0
for i in range(0,7):
if count[i]==1 or count[i]==2 or count[i]==3:
yes=True
else:
return(False)
return(yes)
while True:
if count%18==0 and check()==True:
win+=1
print(win)
count+=1
if count>99999999:
exit()
任何帮助将不胜感激。
答案 0 :(得分:6)
您可以尝试一下。 对我来说看起来更简单。
count=0
for i in range(*number_after_11111111_which_is_divisible_by_18* ,33333333, 18):
for j in str(i):
if int(j) not in [1,2,3]:
pass
else:
count+=1
print(count)
范围从11111111之后的第一个数字开始,该数字可以被18整除,一直到33333333立即增加18,然后检查该数字是否包含任何非[1,2,3]值并递增计数。
您只能从11111111到33333333过滤掉,因为不会有任何数字完全包含1或2或3。
答案 1 :(得分:4)
在10000000和99999999之间可被18整除的值总数
等于
0到99999999之间可被18整除的值的总数减去0到10000000之间可被18整除的值的数目
ttl_in_range = (99999999//18 - 10000000//18) = 5000000
由3个,2个和1个组成的总数=每个点3个选择,共8个点= 3**8 = 6561
您可以很快地看到,只需迭代所有值而忽略其他值即可
您可以使用itertools产品找到该范围内的所有值
ct = 0
for val in itertools.product("123",repeat=8):
if int("".join(val))%18 == 0:
ct += 1
print(ct)
答案似乎是 267 ,值是8位数字,该数字可以被18、12、3个数字完全除
@MBo的以下答案比该答案要快得多:)
答案 2 :(得分:1)
我们可以避免强力和数字合成。只需应用一些逻辑,数学和组合运算即可:
包含1..3范围内的8位数字且可被18整除的数字,必须以数字2(xxxxxxx2
)结尾-才能为偶数。
现在我们有7位数字,总和为7或16(以便将整数除以9)。
说明:
如果数字是偶数,则可以被18整除,而可以被9整除。
被9整除的数字,总和为9,18,27 ...
对于最大位数为3的8位数字,27太高了,因此可能的数字总和为9和18。
如果我们减去2(最后一位数字),那么7位第一位数字之和就是7或16
我们可以求和7:
我们可以求和16:
(说明:有7个位置,有nCr(7,3)或C(7,3)变体-组合数量-放置三个3's和C(4,3)变体放置三个2个可以释放4个地方)
变体总数为1 + 21 + 140 + 105 = 267 个变体