确定两个数之间有一定因数的整数个数

Determining the number of integers with a certain amount of factors between two numbers

我想实现一个函数,它将三个参数(x、低、高)作为输入 - 所有整数,并找到 x 因子介于 lowhigh。例如,有多少个 50 到 100 之间的整数有 4 个因子?

我的代码如下:

def n_factors(x, lower, upper):
""" Find how many integers have x (user-specified)
    factors from - lower to upper - (user-specified) """
    int_counter = 0 # integer counter
    div_count = 0 # divisor counter 
    for i in range(lower, upper+1):
        for j in range(2, i):
            if (i%j)==0:
                div_count += 1
        if (div_count == x):
            print i
            int_counter += 1
     return int_counter

当我尝试 运行 时,我得到了不正确的结果,例如

n_factors(2,10,20)
10
11
2

这应该列出 10 到 20 之间的四个质数,如果 该功能有效但无效。非常感谢任何帮助!

您需要在每次迭代结束时将 div_count 设置回零:

def n_factors(x, lower, upper):
    int_counter = 0 # integer counter
    div_count = 0 # divisor counter
    for i in range(lower, upper+1):
        for j in range(1, i + 1):
            if (i%j)==0:
                div_count += 1
        if div_count == x:
            print i
            int_counter += 1
        div_count = 0
    return int_counter
def n_factors(x, lower, upper):
    facs = {}
    for f in range(1, int(upper**0.5)+1):
        for n in range(lower+f-(lower%f), upper+1, f):
            if n not in facs: facs[n] = []
            facs[n].append(f)

    for n, numFacs in facs.items():
        if len(numFacs) != x: continue
        print(n)
def n_factors(x, lower, upper):
""" Find how many integers have x (user-specified)
    factors from - lower to upper - (user-specified) """
    int_counter = 0
    div_count = 0
    for i in range(lower, upper+1):
        for j in range(1, i+1):
            if (i%j)==0:
                div_count += 1
        if (div_count == x):
            print i
            int_counter += 1
        div_count = 0 
    return int_counter

你可以通过在稍微高一点的水平上编码来轻松避免这样的错误。

当你需要数"how many times does this condition happen"的时候,你不需要手动设置计数器忘记重新设置——你可以把那句话相当直接地翻译成Python;这里的条件是“ji 没有余数”:

for i in range(lower, upper+1):
    div_count = sum(i%j == 0 for j in range(1,i+1))