Алгоритм еженедельный вопрос 003: флоп

Проблема:

Там 100 считывает цифровой карты от 1 до 100, и последовательно расположенные. Изначально все карты находятся на задней стороной вверх. Кто - то из первых двух карт, каждый один флоп. Тогда 2, 4, 6, ..., 100 карт станут стороной вверх. Далее, еще один человек из первых трех карт, на флопе каждые два (оригинал обратно вверх, переверните лицом вверх; оригинал лицевой стороны вверх, переверните к резервному). Опять же , есть человек , с первых четырех карт, каждые три флоп - карты. Таким образом, начиная с п-й карты, каждая п-1 карты на флопе, не переворачивать , пока не карты.
Алгоритм еженедельный вопрос 003: флоп
Когда все карты больше не ищут перемены, все обратно вверх по номеру карты.

Идеи:

Есть много идей на этот вопрос:

Идеи 1
я , что круглый, начиная с 1, 99 до конца. И J картотеки.
Каждый раунд в соответствии с предметом карт один за другим , чтобы найти смысл вопросов на соответствующем флип.

Мышление 2
I , что круглый, начиная с 1, 99 до конца, и J представляет собой индекс карты.
Каждый раунд на все карты , чтобы соответствовать требованиям переворота.

3 идеи
только карты , когда четное число перескакивает вверх.
Карта перевернута время: когда число шагов о лице для бренда, который не очень легко понять, иллюстрированная.
Такие , как: 4 пластины, на спине вверх на начальном этапе,
круглая 1, 2 пластины с самого начала, шаг 2,4 пластины переворачивается правой стороной вверх,
раунд 2, начиная с пластины 3, размер шага 3,4 пластины не вращается,
из 3, начиная с пластины 4, шаги 4,4 пластина переворачивается обратно вверх,
он не будет перевернуто

Можно видеть, что, когда длина шага представляет собой 2,4, 4 поворотной плиты будет происходить, а делитель в 2 и 4 4.

Такие , как: пластины 6, является обратно первоначальный,
раунд 1, начиная с пластины 2, с шагом 2,6 пластины переворачивается стороной вверх,
раунд 2, начиная с пластины 3, размер шага 3,6 пластина переворачивается обратно вверх;
из 3, 4 , начиная от пластины, шаг размер 4,6 пластины не вращается,
4, 5 , начиная от пластины, шаги 5,6 пластина не вращается;
5, 6 , начиная от пластины, размер шага 6,6 пластины переворачивается вверх правая сторона,
он не будет перевернуто

Вы можете видеть , что , когда размер шага 2,3,6, происходит 6 пластины флип, в то время как число 2,3,6 около 6.
Если это число подсчета обо всех натуральных числах, количество птицы предложение числа является нечетным числом, в конечном итоге лицом к спинке.

Вы можете продолжать резюмировать:

Например:
12 номерного знака, номер около 1,2,3,4,6,12, в общей сложности шесть делителя, и в конечном счете лицо вверх;
16 номерного знака, номер около 1,2,4,8,16, есть пять общий делитель, в конечном счете , является задней облицовкой;
25 пластин, из примерно 1,5,25 числа, общего числа около 3, является обратно в конечном итоге,
отмечались, все из резервной карты 4,16 25, которые являются квадратными числами.
Так что этот вопрос в конечном счете , становится все 1-100 номера , чтобы узнать площадь.

Ответ:

Следующие три идеи выше, даны PHP код и Golang

PHP

// 按顺序进行翻牌,i为牌下标,j为牌下标+步长
function flip1()
{
    $size = 100;
    $cards = array_fill(0, $size, 0); // 初始化数组

    // i为轮次
    for ($i = 1; $i <= $size; $i++) {
        // 如果当前的牌是正面,就翻过来;反之亦然。
        // 每轮步长增长为i+1,
        // 例如:
        // 第一轮起始下标是1,步长是2(=1+1),翻1,3,5...下标的牌
        // 第二轮起始下标是2,步长是3(=2+1),翻2,5,8...下标的牌
        // 以此类推
        for ($j = $i; $j < $size; $j += $i + 1) {
            $cards[$j] = !$cards[$j];
        }
    }
    output($cards);
}

// i为轮次,j为牌下标
// 第1轮:2,4,6...100的牌被翻转,对应的下标为1,2,3...99,(j+1)%(1+1)==0
// 第2轮:3, 6, 9...99的牌被翻转,对应的下标为2,5,8...98,(j+1)%(2+1)==0
// 以此类推,得到公式,(j+1)%(i+1)==0时,牌都会翻转
function flip2()
{
    $size = 100;
    $cards = array_fill(0, $size, 0); // 初始化数组
    for ($i = 1; $i < $size; $i++) {
        for ($j = 1; $j < $size; $j++) {
            if (($j + 1) % ($i + 1) == 0) {
                $cards[$j] = !$cards[$j];
            }
        }
    }
    output($cards);
}

// 当牌i翻转为偶数次时,即为背面朝上
// 当j为i的约数时,会触发一次i的翻转
// 比如:牌4,会在约数为1,2,4时被翻转
// 但所有的牌都是从约数为2开始翻,所以排除掉约数1的情况
// 此时,4号牌只翻转了2次,符合偶数次翻转的情况,所以其最终是背面朝上
function flip3()
{
    $size = 100;
    $tmp = array();

    // i为牌面,数字为1-100的100张牌
    for ($i = 1; $i <= $size; $i++) {
        $flag = false;

        // j为步长
        for ($j = 2; $j <= $size; $j++) {
            if ($i % $j == 0) {
                $flag = !$flag;
            }
        }

        if ($flag == false) {
            $tmp[] = $i;
        }
    }
    echo implode(' ', $tmp) . "\n";
}

function output($cards)
{
    foreach ($cards as $key => $val) {
        if (!$val) {
            echo $key + 1;
            echo " ";
        }
    }
    echo "\n";
}

flip1();
flip2();
flip3();

экспорт

1 4 9 16 25 36 49 64 81 100 
1 4 9 16 25 36 49 64 81 100 
1 4 9 16 25 36 49 64 81 100

Golang

package main

import "fmt"

var size = 100 // 牌数

func main() {
    Flip1()
    Flip2()
    Flip3()
}

// 初始化数据
func initCards() []bool {
    var cards []bool // 存放每张牌的状态
    for i := 0; i < size; i++ {
        cards = append(cards, false)
    }
    return cards
}

// 翻牌算法1
func Flip1() {
    cards := initCards()
    for i := 1; i < size; i++ {
        for j := i; j < size; j += i + 1 {
            cards[j] = !cards[j]
        }
    }
    PrintCards(cards)
}

// 翻牌算法2
func Flip2() {
    cards := initCards()
    for i := 1; i < size; i++ {
        for j := i; j < size; j++ {
            if (j+1)%(i+1) == 0 {
                cards[j] = !cards[j]
            }
        }
    }
    PrintCards(cards)
}

// 翻牌算法3
func Flip3() {
    var cards []int
    for i := 1; i <= size; i++ {
        flag := false
        for j := 2; j <= size; j++ {
            if i%j == 0 {
                flag = !flag
            }
        }
        if flag == false {
            cards = append(cards, i)
        }
    }
    fmt.Println(cards)
}

// 输出牌面
func PrintCards(cards []bool) {
    var results []int
    for i := 0; i < size; i++ {
        if cards[i] == false {
            results = append(results, i+1)
        }
    }
    fmt.Println(results)
}

экспорт

[1 4 9 16 25 36 49 64 81 100]
[1 4 9 16 25 36 49 64 81 100]
[1 4 9 16 25 36 49 64 81 100]

рекомендация

отblog.51cto.com/ustb80/2421507