给定范围内奇偶数的数量

17 Mar 2025 | 6 分钟阅读

给定一个下限 x 和一个上限 y,如果我们要计算范围内的奇数和偶数个数,我们可以选择常规方法,使用 for 循环,从下限迭代到上限,检查范围内的每个数字是否可以被 2 整除,例如:

在 C 语言中:

输出

Number of even and odd numbers in a given range

当我们的范围很小时(最多几百),代码可以正常工作,但当我们尝试处理更大的范围——更高的上限时,代码会花费更多时间。例如,上面的例子花了 10.45 秒。

每次我们想要编写代码时,撇开错误不谈,代码的效率总是由以下因素决定:

  1. 时间
  2. Space (空格)

我们应该用一个不费时的好逻辑来解决这个问题。

逻辑

让我们来分析一些情况,然后自己推导出公式。

下限 = L

上限 = R

范围内的数字个数(包括上下限):(R - L + 1)

  1. 当 N 为偶数时
    例如

    下限 = 10
    上限 = 15
    N = 15 - 10 + 1 = 6
    数字:[10, 11, 12, 13, 14, 15]
    偶数个数:N/2 = 3 = [10, 12, 16]
    奇数个数:N/2 = 3 = [11, 13, 15]
  2. 当 N 为奇数时
    1. 当下限和上限都为偶数时
      例如

      下限 = 10
      上限 = 16
      N = 16 - 10 + 1 = 7
      奇数 = [11, 13, 15] -> 7/2 = 3
      偶数 = [10, 12, 14, 16] -> N - 奇数个数 = 7 - 3 = 4
    2. 当下限和上限都为奇数时
      例如

      下限 = 11
      上限 = 15
      N = 15 - 11 + 1 = 5
      奇数 = [11, 13, 15] -> 5/2 + 1 = 3
      偶数 = [12, 14] -> N - 奇数个数 = 5 - 3 = 2

所以

  1. 当范围内的数字个数是偶数时,其中一半是偶数,另一半是奇数。
  2. 当数字个数是奇数时
    1. 如果下限和上限都是偶数,奇数个数:floor(N/2)
    2. 如果下限和上限都是奇数,奇数个数:floor(N/2) + 1

现在让我们用 C 语言用这个逻辑来设计一个程序。

输出

Number of even and odd numbers in a given range
  1. 我们检查了数字个数(计数)是否为偶数,这发生在当下限和上限的奇偶性不同时(一个偶数,一个奇数)。
    3 4 5 6
    2 3 4 5
  2. 现在,剩下两种情况是当下限和上限的奇偶性都相同时。
    2 3 4 -> 奇数个数:3/2 = 1
    3 4 5 -> 奇数个数:3/2 + 1 = 2

我们也可以使用等差数列。

使用等差数列的第 n 项公式:a + (n - 1)*d

我们可以求出偶数个数或奇数个数,然后从总数中减去该个数来求另一个数。

让我们针对不同情况来计算代码。

情况 1:下限和上限都是偶数

假设我们正在计算 10 到 20 之间的偶数个数。

10 11 12 13 14 15 16 17 18 19 20

观察:

  • 数字是公差为 1 的等差数列。
  • 加粗的数字是公差为 2 的另一个等差数列。
  • 所以,我们可以找到 20 在加粗等差数列中的位置,从而找到区间内偶数的个数。
    20 = 10 + (n - 1)*2
    10 = (n - 1)*2
    5 = (n - 1)
    n = 6
  • 现在,9 - 4 = 5 个偶数。11 - 6 = 4 个奇数。

情况 2:下限和上限都是奇数

假设我们正在计算 10 到 20 之间的偶数个数。

11 12 13 14 15 16 17 18 19

观察:

  • 数字是公差为 1 的等差数列。
  • 加粗的数字是公差为 2 的另一个等差数列。
  • 首项 = a = 11
  • 现在,我们可以找到(末项 - 1)= 18 的位置,以找到偶数的个数,就像在前一种情况中一样。
    18 = 12 + (n - 1)*2
    6 = (n - 1)*2
    3 = (n - 1)
    n = 4
  • 现在,奇数个数 = 9 - 4 = 5

情况 3:下限为奇数,上限为偶数

假设我们正在计算 10 到 20 之间的偶数个数。

11 12 13 14 15 16 17 18 19 20

观察:

  • 数字是公差为 1 的等差数列。
  • 加粗的数字是公差为 2 的另一个等差数列。
  • 首项 = a = 11
  • 现在,我们可以找到末项 = 20 的位置,以找到偶数的个数,就像第一种情况一样。
    20 = 12 + (n - 1)*2
    8 = (n - 1)*2
    4 = (n - 1)
    n = 5
  • 现在,奇数个数 = 10 - 5 = 5

情况 4:下限为偶数,上限为奇数

假设我们正在计算 10 到 20 之间的偶数个数。

12 13 14 15 16 17 18 19 20 21

观察:

  • 数字是公差为 1 的等差数列。
  • 加粗的数字是公差为 2 的另一个等差数列。
  • 首项 = a = 12
  • 现在,我们可以找到末项 - 1 = 20 的位置,以找到偶数的个数,就像第一种情况一样。
    20 = 12 + (n - 1)*2
    8 = (n - 1)*2
    4 = (n - 1)
    n = 5
  • 现在,奇数个数 = 10 - 5 = 5

所以,将所有内容集中在一起。

  1. 如果下限和上限都是偶数,我们可以直接使用第 n 项公式。
  2. 如果下限或上限是奇数,我们需要修改这些限制。
    lower = lower + 1
    upper = upper - 1

程序

输出

Enter the lower limit: 10
Enter the upper limit: 20
Number of even numbers: 6
Number of odd numbers: 5

编程技能在于思考能力。观察一下,我们讨论的两种方法是相似的。


下一个话题C语言中的qsort()