有多少个8位数字都可以被18整除,并且每个数字都是1、2或3?

时间:2018-10-12 23:28:46

标签: python math numbers

使用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()

任何帮助将不胜感激。

3 个答案:

答案 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:

  • 从7个开始- 1 个变体

我们可以求和16:

  • 使用两个3和五个2-C(7,2)= 21 变体
  • 使用三个3和三个2-C(7,3)* C(4,3)= 35 * 4 = 140 变体

(说明:有7个位置,有nCr(7,3)或C(7,3)变体-组合数量-放置三个3's和C(4,3)变体放置三个2个可以释放4个地方)

  • 使用四个3和一个2'-C(7,4)* C(3,1)= 35 * 3 = 105 变体

变体总数为1 + 21 + 140 + 105 = 267 个变体