Почему это l oop 7 раз вместо 5? - PullRequest
0 голосов
/ 11 марта 2020

В книге написано, что правильный ответ - 7, но я считаю 5?

«Сколько раз этот l oop?»

int j = 2;
for (int i = 1; i < 100; i = i * 2)
{
    j = j - 1;
    while (j < 25)
    {
        j = j + 5;
    }
}

Может ли кто-нибудь мне объяснить?

Чтобы добраться до 25, я бы oop 5 раз, а не 7? 5, 10, 15, 20, 25 ... Я скучаю, где они получают 7 от

enter image description here

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Потому что i увеличивает в два раза его значение, а 64 * 2 = 128 и 128 is > 100.

Так 7 раз: 1, 2, 4, 8, 16, 32, 64

Не бойтесь поиграть, если вы наденете Нет доступа к IDE: https://dotnetfiddle.net/#

using System;

public class Program
{
    public static void Main()
    {
        int j = 2;
        for (int i = 1; i < 100; i = i * 2)
        {
            Console.WriteLine("i=" + i);
            j = j - 1;
            while (j < 25)
            {
                j = j + 5;
                Console.WriteLine("j=" + j);
            }           
        }
    }
}
0 голосов
/ 11 марта 2020

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

Если вы сделаете небольшое изменение в коде чтобы распечатать, когда происходят определенные события, вы увидите подробности:

#include <stdio.h>
int main(void) {
    int j = 2;
    printf("initial j: %d\n", j);
    for (int i = 1; i < 100; i = i * 2) {
        printf("LOOP-I i: %d\n", i);
        j = j - 1;
        printf("decremented j: %d\n", j);
        while (j < 25) {
            j = j + 5;
            printf("LOOP-J plus5'ed j: %d\n", j);
        }
    }
    return 0;
}

Вывод этого (аннотирован справа с l oop отсчетами):

                            iLoop jLoop
                            ----- -----
initial j: 2
LOOP-I i: 1                     1
decremented j: 1
LOOP-J plus5'ed j: 6                  1
LOOP-J plus5'ed j: 11                 2
LOOP-J plus5'ed j: 16                 3
LOOP-J plus5'ed j: 21                 4
LOOP-J plus5'ed j: 26                 5
LOOP-I i: 2                     2
decremented j: 25
LOOP-I i: 4                     3
decremented j: 24
LOOP-J plus5'ed j: 29                 6
LOOP-I i: 8                     4
decremented j: 28
LOOP-I i: 16                    5
decremented j: 27
LOOP-I i: 32                    6
decremented j: 26
LOOP-I i: 64                    7
decremented j: 25

Существует семь LOOP-I выходов и шесть LOOP-J выходов - последний немного отличается от вашего предположения о пяти, так как уменьшение j в пределах i l oop еще больше понижает его до 25 так что j l oop будет повторяться в последний раз.

Если ответ, который они дают, равен семи, то они почти наверняка говорят о внешнем i l oop. С точки зрения пуриста, ответ на вопрос "Сколько раз будет это oop?" ясно 13 (семь для i l oop и шесть для j один).


(a) Однако я подозреваю, что вы неправильно поняли вопрос. Из (не совсем полного) изображения, которое вы разместили (внутри границы ниже), и обоснованного предположения относительно остальной части вопроса, он, похоже, задает вопрос:

+---------------------------------------------+
| Here are a few loops.  Write down if each lo|op will
| eventually end. If it's going to end, how ma|ny
+---------------------------------------------+
  times will it loop?

Другими словами, он хочет, чтобы вы проанализировали каждый l oop, и в этом случае два ответа будут да / семь для внешнего i l oop и да / шесть для внутренний j один.

0 голосов
/ 11 марта 2020

Для внешнего l oop я бы go через значения [1, 2, 4, 8, 16, 32, 64, 128]. Тогда внутри каждого l oop j будут изменены значения;

 1 => 1, [6, 11, 16, 21, 26],
 2 => 25,
 4 => 24, [29],
 8 => 28,
 16 => 27,
 32 => 26,
 64 => 25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...