给定范围内奇偶数的数量17 Mar 2025 | 6 分钟阅读 给定一个下限 x 和一个上限 y,如果我们要计算范围内的奇数和偶数个数,我们可以选择常规方法,使用 for 循环,从下限迭代到上限,检查范围内的每个数字是否可以被 2 整除,例如: 在 C 语言中:输出  当我们的范围很小时(最多几百),代码可以正常工作,但当我们尝试处理更大的范围——更高的上限时,代码会花费更多时间。例如,上面的例子花了 10.45 秒。 每次我们想要编写代码时,撇开错误不谈,代码的效率总是由以下因素决定: - 时间
- Space (空格)
我们应该用一个不费时的好逻辑来解决这个问题。 逻辑让我们来分析一些情况,然后自己推导出公式。 下限 = L 上限 = R 范围内的数字个数(包括上下限):(R - L + 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] - 当 N 为奇数时
- 当下限和上限都为偶数时
例如 下限 = 10 上限 = 16 N = 16 - 10 + 1 = 7 奇数 = [11, 13, 15] -> 7/2 = 3 偶数 = [10, 12, 14, 16] -> N - 奇数个数 = 7 - 3 = 4 - 当下限和上限都为奇数时
例如 下限 = 11 上限 = 15 N = 15 - 11 + 1 = 5 奇数 = [11, 13, 15] -> 5/2 + 1 = 3 偶数 = [12, 14] -> N - 奇数个数 = 5 - 3 = 2
所以 - 当范围内的数字个数是偶数时,其中一半是偶数,另一半是奇数。
- 当数字个数是奇数时
- 如果下限和上限都是偶数,奇数个数:floor(N/2)
- 如果下限和上限都是奇数,奇数个数:floor(N/2) + 1
现在让我们用 C 语言用这个逻辑来设计一个程序。 输出  - 我们检查了数字个数(计数)是否为偶数,这发生在当下限和上限的奇偶性不同时(一个偶数,一个奇数)。
3 4 5 6 2 3 4 5 - 现在,剩下两种情况是当下限和上限的奇偶性都相同时。
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
所以,将所有内容集中在一起。 - 如果下限和上限都是偶数,我们可以直接使用第 n 项公式。
- 如果下限或上限是奇数,我们需要修改这些限制。
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
编程技能在于思考能力。观察一下,我们讨论的两种方法是相似的。
|