美圖欣賞 | 設為首頁 | 加入收藏 | 網站地圖

當前位置:電腦中國 > 編程 > C++ >

C++之開燈問題(鏈表)

2019-10-18 14:29|來源:未知 |作者:dnzg |點擊:

有n盞燈,編號為1~n。第1個人把所有燈打開,第2個人按下所有編號為2的倍數開關(這些燈將被關掉),第3個人按下所有編號為3的倍數的開關,以此類推。一共有k個人,問最后有哪些燈開著?輸入n和k,輸出開著的燈的編號。k<=n<=100

 

樣例輸入    7  3

樣例輸出    1  5   6   7

#include<stdio.h>
#include <stdlib.h>

typedef struct light{
    int state;  // state 為 0 時代表燈是關著的,為 1 時代表燈是亮著的 
    struct light *next;
};

int main(void)
{
    int num, k, i, j;
    light *light_state = NULL;
    light *head = NULL, *temp = NULL;
    
    printf("請輸入燈的數量n,人的數量k:");
    scanf("%d %d", &num, &k);

    for(i = 0; i < num; i++)   // 創建長度為 num 的鏈表 
    {
        light_state = (light*)malloc(sizeof(light));
        if (head == NULL)
            head = light_state;
        else
            temp->next = light_state;
        light_state->next = NULL;
        light_state->state = 0;
        temp = light_state;
    }

    for(j = 0; j < k; j++)
    {
        light_state = head;
        for(i = 0; i < num; i++)
        {
            if((i + 1) % (j + 1) == 0)  // 燈的編號符合需要對應的人按開關時 
                if(light_state->state == 0)
                {
                    light_state->state = 1;
                }
                else if(light_state->state == 1)
                {
                    light_state->state = 0;
                }
            light_state = light_state->next;
        }
    }
        
    printf("開著的燈的編號為:");
    light_state = head;
    for(i = 0; i < num; i++)
    {
        if(light_state->state == 1)
        {
            printf("%d ", i+1);
        }
        light_state = light_state->next;
    }
    
    printf("\n");
    system("pause");
}
(責任編輯:dnzg)
安卓手机安全赚钱软件哪个好用