点灯问题
点灯问题
问题描述:
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推。一共有k个人,问最后有哪些灯开着?
输入 n 和 k ,输出开着的灯的编号。k<=n<=1000
输入:
输入一组数据:n 和 k
输出:
输出开着的灯的编号
思路:
首先动态创建一个有n个元素的整型数组,每个元素有1和-1两种状态,分别表示开和关,然后初始化每个元素为-1,表示灯关闭,然后先从1开始遍历k个人,再以k的间隔从k开始遍历每个数组的元素,并让每个元素乘以 -1,最后输出数组中值为1的元素索引+1,即为开着的灯的编号。
代码:
#include <stdio.h> #include <malloc.h> void func(int *num, int n, int k) { int i, j; for(i=1;i<=k;i++) { for(j=i-1;j<n;j+=i) { num[j] = num[j] * (-1); } } // 输出开着的灯编号 for(i=0;i<n;i++) { if(num[i] == 1) { printf("%d ", i+1); } } } int main() { int n; int k; scanf("%d%*c", &n); scanf("%d%*c", &k); int *num = (int *)malloc(sizeof(int) * n); int i; for(i=0;i<n;i++) { num[i] = -1; } func(num, n, k); free(num); return 0; }
测试输出:
知行合一,
翻万卷书,游千里路,会百家才