有n盏灯,编号为1~n。第1我的把全部灯打开,第2我的按下全部编号为2的倍数开关(这些灯将被关掉),第3我的按下全部编号为3的倍数的开关,以此类推。一共有k我的,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k<=n<=100spa
样例输入 7 3code
样例输出 1 5 6 7blog
#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"); }