Решение проблемы 100 дверей не работает должным образом - PullRequest
0 голосов
/ 22 апреля 2020

Этот вопрос будет о проблеме 100 дверей, которая является известной проблемой от Розетты. Вот проблема:

  • В начале 100 дверей, которые все изначально закрыты.
  • Вы делаете 100 проходов у дверей.
  • В первый раз через, посетите каждую дверь и переключите дверь (если дверь закрыта, откройте ее; если она открыта, закройте ее).
  • Второй раз, посещайте только каждую 2-ю дверь (дверь № 2, № 4 , # 6, ...) и переключите его.
  • В третий раз заходите в каждую 3-ю дверь (дверь № 3, # 6, # 9, ...) и т. Д. c посетите только сотую дверь.

Вопрос: В каком состоянии находятся двери после последнего прохода? Какие из них открыты, а какие закрыты?

Итак, моя цель - дать программе ввод, скажем, n, так что после n-го прохода какие двери будут открыты, но в нем есть поток, и я не смог Найди это. Если есть кто-нибудь, кто может исправить проблемы моей логики c, я был бы счастлив. Спасибо вам всем.

#include <math.h>
#include <stdio.h>
int a = 1;

int main(){
    int doors[101];
    int i,j,x,b;

    scanf("%d",&x);
    for(j=1;j<=x;j++)
    {
        for(i=j;i<=100;i=i+j)
        {
            if(doors[i] == 0)
            {
                doors[i]==1;
            }
            else
            {
                doors[i]==0;
            }
        }
    }

    for(b=1;b=100;b++){
        if(doors[b]==1)
        {
            printf("%d\n",b);
        }
    }

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 22 апреля 2020

Хорошо, в вашем коде было несколько ошибок:

int doors[101];   // uninitialized array. You want int doors[101] = {0};
...
        if(doors[i] == 0)      // ok == for a comparison
        {
            doors[i]==1;       // NO! an assignation is expected: doors[i] = 1;
        }
        else
        {
            doors[i]==0;       // id.: doors[i] = 0;
        }
...
for(b=1;b=100;b++){            // NO! a comparison is expected: for(b=1;b<=100;b++)

Этого достаточно, чтобы получить последовательность идеальных квадратов: 1 4 9 16 25 36 49 64 81 100.

Но вы постоянно используете свой массив, начиная с индекса 1, который является антипаттерном на языке C. Ваш код может быть упрощен до:

#include <stdio.h>
#define NDOORS 100

int main() {
    int doors[NDOORS] = { 0 };

    for (int j = 1; j <= NDOORS; j++)
    {
        for (int i = j-1; i < NDOORS; i += j)
        {
            doors[i] = 1 - doors[i];
        }
    }

    for (int b = 0; b <= NDOORS; b++) {
        if (doors[b] == 1)
        {
            printf("%d\n", b+1);
        }
    }

    return 0;
}
1 голос
/ 22 апреля 2020

Ответ, данный здесь { ссылка } - это ответ, который нужно принять, поскольку он объясняет проблемы в коде и предлагает решение.

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

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

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

Это зависит от количества делителей, которое имеет номер двери, то есть четное число делителей или нечетное число делителей.

Пример:

14 have the divisors 1, 2, 7, 14 That's an even number so door 14 is still closed

16 have the divisors 1, 2, 4, 8, 16 That's an odd number so door 16 will be open

Единственными числами, которые имеют нечетное число делителей, являются квадратные числа.

Поэтому вы можете просто сделать:

int numDoors = 100;
for (int i=1; (i*i) <= numDoors; ++i) printf("%d\n", i*i);

Это просто, быстро и без массивов - но требует, чтобы вы знали загадку заранее: -)

0 голосов
/ 22 апреля 2020

Простой ruby код для этой проблемы:

LEN = 100
array = [false] * LEN
(1..LEN).each do |pass|
  (-1..LEN).step(pass).each do |i|
    next if i == -1
    break if i >= LEN
    array[i] = !array[i]
  end
  # puts "Pass: #{pass}"
  # puts "Gates: #{array.inspect}"
end

array.count(true)

Вывод: 10

...