在while循环中使用if语句?

0 投票
6 回答
2848 浏览
提问于 2025-04-18 16:43

我需要用一个while循环和一个if语句来写一个函数 div_3_5 (start, end),这个函数的作用是计算从 startend 之间(不包括 end)有多少个整数是能被3或5整除的。

我不需要列出这些数字,只需要告诉我有多少个这样的数字就可以了。

我遇到了一个错误,要么是说我需要一个返回值,要么是说用这个代码给出的答案不正确。

def div_3_5(start, end):
    x = 0
    while start < end:
        x = x + start
        start = start + 1
        if (x%3 == 0) or (x%5 == 0):    
            return x

6 个回答

0

我相信还有很多更优雅的解决方案,但这个方法看起来是有效的。

def div_3_5(start, end):
count = 0
x = 0
while start < end:
    start += 1
    x += 1
    if (x%3 == 0) or (x%5 == 0):
        count += 1
return count
0

你的问题是,当你遇到第一个符合条件的情况就返回了,这样不对。你需要把所有符合条件的都统计出来,然后再返回结果。

你可以试试这种方法,它会返回一个符合条件的列表:

def div_3_5(start, end):
    numbers_3_5 = []
    for number in range(start, end):
        if number % 3 == 0 or number % 5 == 0:
            numbers_3_5.append(number)
    return len(numbers_3_5)

举个例子:

print div_3_5(3, 10)

输出结果:

   4

补充:

可以用一个循环来实现:

def div_3_5(start, end):
    numbers_3_5 = []
    while start < end:
        if start % 3 == 0 or start % 5 == 0:
            numbers_3_5.append(start)
        start += 1
    return len(numbers_3_5)
2

你可以为范围内每个能被 35 整除的数字生成一个 1,然后把所有的 1 加起来:

def div_3_5(start, end):
    return sum(1 for x in xrange(start, end) if (x % 3 == 0) or (x % 5 == 0))

额外的小技巧

如果需要的话,你还可以创建一个这样的函数生成器:

def div_generator(divs):
    return lambda start, end: sum(
        1 for x in xrange(start, end)
          if any(x % div == 0 for div in divs))

div_3_5 = div_generator([3, 5])
2

你的代码不应该更像这样吗:

def div_3_5(start, end):
    x = 0
    while start < end:
        if (start%3 == 0) or (start%5 == 0):
            x += 1
        start = start + 1  
    print x
    return x

调用:

div_3_5(1,9)

输出:

3
2

对于任何一个数字 x,在 1 到 x 之间(包括 x 本身),有 x//n 个数字是可以被 n 整除的。因此,在 1 到 x 之间,有 x//3 + x//5 - x//15 个数字是可以被 3 或 5 整除的(这是用到了一种叫做包含-排除原理的方法)。

这样,你就可以用 O(1) 的方式来计算这个函数:

def d35(x):
    return x//3 + x//5 - x//15

def div3or5(start, end):
    return d35(end-1) - d35(start-1)

撰写回答