Подтвердить что ты не робот

Как написать цикл for, который подберет счет, где он остановился?

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

0 - 0
0 - 1
0 - 2
0 - 3
0 - 4
0 - 5
0 - 6
0 - 7
0 - 8
0 - 9
0 - 10
0 - 11

1 - 12
1 - 13
1 - 14
1 - 15
1 - 16
1 - 17
1 - 18
1 - 19
1 - 20
1 - 21
1 - 22
1 - 23

2 - 24
2 - 25
2 - 26
2 - 27
2 - 28
2 - 29
2 - 30
2 - 31
2 - 32
2 - 33
2 - 34
2 - 35

Внутренний цикл должен продолжаться от числа, где был завершен первый внутренний цикл. в первой итерации он остановился на 11, второй раз, когда дело доходит до внутреннего цикла, оно должно идти от 12 - 24 и т.д.

var count = 0;
var val = 0;
for(i = 0; i < 3; i++) {
    for(j = 0; j < count + 12; j++) {
        console.log(i + " - " + j);       

    }
    val = j;
    count = count + j;
    console.log(count);
}
4b9b3361

Ответ 1

Здесь есть несколько "умных" ответов. Я бы придерживался "простого для чтения и простого отладки" ответа. Здесь решение в С#, которое должно быть достаточно простым для перевода:

int k = 0;
for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 12; j++)
    {
        Console.WriteLine(i + " - " + k++);
    }
    Console.WriteLine();
}

Организационные навыки Beat Algorithmic Wizardry

Ответ 2

Вам не нужно 2 цикла, вы можете достичь этого с помощью одного цикла:

for (var i = 0; i < 36; i++){
  console.log(Math.floor(i/12) + " - " + i);  
}

Если вам не нравится Math.floor, вы можете использовать оператор double bitwise not для усечения float:

for (var i = 0; i < 36; i++){
  console.log(~~(i/12) + " - " + i);  
}

Ответ 3

Один цикл

Вам не нужны два цикла, потому что вы можете использовать некоторую простую математику.

Используйте оператор modulo (%), чтобы найти остаток i, деленный на 12, если нет остатка, increment n, в противном случае продолжить.

Поскольку 0 технически кратно двенадцати, (0 кратно всем), вам нужно запустить n с минус один.

function demo(n, i) { document.body.innerHTML += n + ' ' + i + '<br>'; }

var x = 12, y = 3, l = (x * y), n =-1; 
for(var i = 0; i < l; ++i) {
    if(i % x === 0) ++n;
    demo(n, i);
}

Ответ 4

Это использует два оператора цикла, но, честно говоря, по-прежнему использует одинаковое количество циклов в целом, независимо от того, как вы его разложите (т.е. два цикла, цикл 3 и 12 раз каждый или один цикл цикла 36 раз. 36 петель в любом случае).

Он также принимает параметры для поддержки разных значений:

function doubleLoop(outerCount, innerCount) {
    for (i = 0; i < outerCount; i++) {
        var currentOffset = (i * innerCount);

        for (j = 0; j < innerCount; j++) {
            console.log(i + " - " + (currentOffset + j));
        }
    }
}

Затем просто назовите его любыми номерами "count", которые вам нужны:

doubleLoop(3, 12);  //this would get you what you asked for in your question

Ответ 5

Не так хорошо, как первый подход:

var majorCount = 3;
var minorCount = 12;
var counter = 0;

for(var i = 0; i < majorCount; i++) {
  for (var x = counter; x < counter + minorCount; x++) {
    console.log(i + " - " + x);
  }
  counter += minorCount;
}

Ответ 6

Если вы не хотите использовать два цикла и думаете, что math.floor слишком дорого.

http://jsfiddle.net/rdh5mv59/

var firstID = 0;
var RangeSize = 12;
for (i = 0; i < 36; i++) {
    if (i >= RangeSize * (firstID + 1)) {
        firstID++;
    }
    console.log(firstID + " - " + i);
}