Другие ответы касались правильного использования cin
, однако есть и ошибка алгоритма. Код возвращает неверный результат, если последнее число кратно 3.
Например, если вы введете числа 4 и 6, он вернет 0, если 6 кратно 3, когда он должен вернуть 1.
Это можно исправить, изменив:
for (int i = start; i < end; i++) {
на
for (int i = start; i <= end; i++) {
Однако алгоритм крайне неэффективен, когда целые числа находятся далеко друг от друга. Изучение каждого целого числа заняло бы много времени, если, например, оно составляет 15 и 2 000 000 000. Это похоже на умножение двух чисел, просто добавляя одно из них снова и снова.
Этот код сначала замечает, что число значений, делимых ровно на 3, не изменится, если кратное 3 будет вычтено как из начала, так и изконечные значения.
Во-вторых, после этого количество значений включительно между началом и концом будет точно равно значению end/3
, увеличенному на единицу, если start==0
Таким образом, этот код будет производитьправильный ответ без зацикливания:
#include <iostream>
using namespace std;
int specialNumbers(int start, int end) {
int adj = 3 * (start / 3); // find and remove the multiples of 3 from start and end
start = start - adj; // start will now be either 0, 1 or 2
end = end - adj;
int count = end / 3; // count is the number of exact multiples of 3 in the sequence
if (start == 0) // unless the adjusted start is zero in which case it must be incremented
count++;
return count;
}
int main() {
int a, b;
while (1) {
cout << "Enter two numbers to find total number of integars divisble by 3 between them" << endl;
cin >> a >> b;
int n = specialNumbers(a, b);
cout << "Number of integars divisible by 3 between" << a << "and" << b << "are" << n << endl;
}
return 0;
}