Понимание решения для реализации Square() без использования оператора умножения

В настоящее время я работаю над «Принципами программирования и практикой использования C++» Бьярна Страуструпа. Одно из упражнений «попробуй это» — реализовать квадратную функцию без использования оператора умножения. Я нашел решение:

int archaic_square(int v) {
  int total = 0;

  for (int i = 0; i < v; ++i) {
      total += v;
  }

return total;

}

int main() {

  for (int i = 0; i < 100; ++i) {
      cout << i << '\t' << archaic_square(i) << '\n';
  }

}

Я знаю, что это работает и выводит квадрат целых чисел от 0 до 99, но я не понимаю, как это работает. Может ли кто-нибудь объяснить, что именно выводит функция, а также какая переменная total будет при увеличении v?

Я пробовал делать это на бумаге и работал над этим. Учитывая, что v увеличивается на 1, как ввод v = 2 в функцию возвращает 4? Я, кажется, получаю 3 всякий раз, когда я работаю над этим вручную.

Я уверен, что это довольно простая проблема, я только начинаю и пытаюсь понять этот язык.

Как получить результат 3 при отработке archaic_square(2) на бумаге? Это потому, что вы думаете, что «учитывая, что v увеличивается на 1»? Нет, i увеличивается на 1. v не меняется.

mkrieger1 20.12.2020 17:36
archaic_square() устанавливает total в ноль, а затем добавляет v к total ровно v раз.
Peter 20.12.2020 17:36

Секретное оружие программиста — отладчик. Отладчик позволяет вам запускать программу с контролируемой вами скоростью, чтобы вы могли не отставать и наблюдать за всем, что делает программа, как она это делает. Как видно из названия, он отлично подходит для отладки, но также бесценен для понимания логики кода без ошибок.

user4581301 20.12.2020 17:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
130
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Если вы сомневаетесь, я бы посоветовал вам распечатать значение для каждой итерации внутри функции,

int archaic_square(int v) {
    int total = 0;

    for (int i = 0; i < v; ++i) {
        total += v;
        std::cout << "total= " << total << " where i= " << i << " \n"; // --- HERE ----
}

return total;

}

вы должны увидеть вывод как

2  where i= 0
4  where i= 1

(когда v передается как 2)

В функции archaic_square я начинаю с 0, и это цикл повторяется v раз, и каждый раз общее количество становится total плюс v, и это похоже на v * v:

int archaic_square(int v) {
    int total = 0;
    
    for (int i = 0; i < v; i++) {
        total += v;
    }
    
    return total;
}
Ответ принят как подходящий

Это просто, вы можете думать об умножении как: например, я говорю 3 * 5, это эквивалентно тому, что я говорю 5 + 5 + 5 или 3 + 3 + 3 + 3 +3.

Точно так же эта функция суммирует N количество N раз. Например, скажем, я прошел v=5. Это будет работать следующим образом: total= 5 + 5 + 5 + 5 + 5 = 25.

Квадрат числа — это то же самое, что сложение этого числа столько раз, сколько это число. Это archaic_square(int v), и цель total состоит в том, чтобы быть суммой добавления v к себе v раз. v не увеличивается на 1 в этой функции, i увеличивается.

В main эта функция вызывается с i, начиная с 0, добавляя 1 к себе в каждом цикле и продолжая, пока i меньше 100. Оно не меньше 100, когда оно равно 100, поэтому оно останавливается на 99.

Важно отметить, что i в archaic_square не то же самое i в main — это область видимости переменной. Они не знают друг друга. Важно отметить, что именно здесь важно int i. Если бы вы использовали только i, то ожидалось бы, что i определено в другом месте за пределами этой области — вы получите сообщение об ошибке, если сделаете это здесь, и если вы сделаете это, а затем определите i глобально, они будут мешать друг другу, и все это будет перерыв.

i обычно используется как имя переменной цикла (итерации). так что вы увидите это много.

Следовательно: на консоль выводятся квадраты от 0 до 99.

Как новичок, это то, что я понял об этом решении после того, как много почесал голову, и я чувствую, что мой комментарий в этом коде функции является довольно хорошим объяснением для начинающих!

int archaic_square(int v) 

{

int total =0;

for (int i = 0; i < v; ++i) //this loop will repeat v times (until i is less than v; keep increasing i)
{
    total += v; 

    /*Let us take the example of v = 5. So variable 'i' (which is in the for loop) will keep incrementing by 1 if value is less than 5.
    So loop will repeat 5 times. So each time loop repeats the new value of total will become  
    total = (total +5). This process will repeat 5 times. As value of the variable total is zero, the final value of total will be: 
    (total + 5) + (total + 5) + (total + 5) + (total + 5) + (total + 5).
    [Since total value is 0, 5 is getting added 5 times, which is 25 which is 5 times 5] 
    Hence, this loop is doing multiplication.*/
}

return total;
}

Удачного кодирования!

Другие вопросы по теме