Напишите функцию, которая вычисляет и возвращает общее число целых чисел между двумя целевыми числами, которые делятся на 3 - PullRequest
3 голосов
/ 20 октября 2019

Мне было поручено написать этот код, и сначала он казался довольно простым. Я написал это и попытался понять это как можно лучше, и действительно думал, что у меня это получилось. Но когда я попытался проверить код с помощью VisualStudio, всплыли ошибки с кодом, и код не завершил обработку.

Вот назначение:

Напишите функцию с именем specialNumbers, которая вычисляет и возвращаетобщее число целых чисел между двумя целевыми числами, которые делятся на 3. Функция принимает два параметра: 1. начало, целое число 2. конец, целое число больше, чем начало Функция возвращает общее число, кратное 3, между началом иконец, включительно. Например, если start = 3, end = 10, функция вернет 3.

Вот код, который у меня есть:

#include <iostream>
using namespace std;

int specialNumbers(int start, int end) {
    int count = 0;
    for (int i = start; i < end; i++) {
        if (i % 3 == 0)
            count++;
    }
    return count;
} 

int main() {
    int a, b;
    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;
}

Отображается ошибка:

Ошибка отладки! Переменная b используется и не инициализируется

Ответы [ 3 ]

3 голосов
/ 20 октября 2019

Вы используете неправильный синтаксис для извлечения двух целых чисел из cin, это должно быть:

cin >> a >> b;

Ваш код выдает "неинициализированную ошибку" из-за семантики оператор запятой , который принимает два аргумента и возвращает последний.

Проще говоря, ваш код эквивалентен:

(cin >> a), b;  // ERROR: `b` isn't being initialized.
0 голосов
/ 22 октября 2019

Другие ответы касались правильного использования 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;
}
0 голосов
/ 20 октября 2019

ИзменитьЗамените это:

cin >> a, b;

на:

cin >> a >> b;

, поскольку в этом случае вам определенно не нужен оператор запятой, а оператор >>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...