对于这个答案,我首先复制了您的代码,添加了来自 Govind Parmar 答案的 scanf 改进,并添加了一个计数器变量。
现在我想以 Eugene Sh. 的评论为基础,完全摆脱循环。这意味着我的答案不会打印出每个 11 的倍数,但无论如何您都不需要这样做。
首先,我们需要检查N2 >= N1 是否为真。当我们使用循环时,如果这个条件为假,则循环不会执行,但是当我们摆脱循环时,我们需要手动检查这个条件。
对于问题的主要部分,可以这样想:你有一个数字范围,从N1 开始,到N2 结束。您想确定该范围内有多少个 11 的倍数。为此,请在该范围内找到 11 的最小倍数,在该范围内找到 11 的最大倍数,并找出它们之间有多少个 11。
要找到大于或等于N1 的 11 的最小倍数,首先找到小于或等于 11 (N1 / 11) 的最大倍数,然后在必要时添加 11。
要找到小于或等于N2 的 11 的最大倍数,只需执行 N2 / 11。
将这些倍数分别称为smallest_multiple 和largest_multiple。现在,要查找总共有多少个倍数,请执行 (largest_multiple - smallest_multiple) / 11 + 1。
把它们放在一起:
#include <stdio.h>
int main () {
int N1;
printf("Enter an integer N1: ");
if (scanf(" %d", &N1) != 1) {
// Handle scanf failure
}
int N2;
printf("Enter an integer N2: ");
if (scanf(" %d", &N2) != 1) {
// Handle scanf failure
}
int count;
if (N2 >= N1) {
int smallest_multiple;
int largest_multiple;
smallest_multiple = N1 / 11;
if (smallest_multiple < N1) {
smallest_multiple += 11;
}
largest_multiple = N2 / 11;
if (largest_multiple >= smallest_multiple) {
count = (largest_multiple - smallest_multiple) / 11 + 1;
} else {
count = 0;
}
} else {
count = 0;
}
printf("Saw %d multiples of 11 in this range.\n", count);
printf("Exiting...");
return 0;
}
这个答案可能存在一个问题:如果N1 < 0 可能无法正常工作。不幸的是,大多数 C 算术运算符指南在除法方面似乎都忽略了负数。到目前为止我发现的最好的是https://en.cppreference.com/w/cpp/language/operator_arithmetic:
商在实现定义的方向上四舍五入。 (直到 C++11)
商被截断为零(小数部分被丢弃)。 (C++11 起)
当我知道更多时,我会更新这个答案。
编辑:我发现我原来的答案有问题。如果范围内没有 11 的倍数,则 smallest_multiple 将大于 N2(范围外),largest_multiple 将小于 N1(范围外)和 largest_multiple - smallest_multiple == -11。我已经编辑了我的答案以对此进行测试。