1,在南阳理工acm上 第77题
2,在蓝桥杯模拟赛第二题也有
就来总结下~~~(ahhhh 第一次写博客)
开灯问题
时间限制:3000 ms | 内存限制:65535 KB
难度:1
描述
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000
输入
输入一组数据:n和k
输出
输出开着的灯编号
样例输入
7 3
样例输出
1 5 6 7
#include<stdio.h>
int main() {
int a[1001] = {0}, k, n;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n;i++){
for(int j = 1; j <= k; j++){
if (i % j == 0)
a[i]++;
}
}
for(int i = 1; i <= n; i++) {
if(a[i] % 2 == 1)
printf("%d ",i);
}
} // 这是我第一次写的 用的是奇偶的方法
#include<iostream>
using namespace std;
int main() {
int n, k, a[1001] = {0};
cin >> n >> k;
for (int i = 1; i <= k; i++)
for (int j = i; j <= n; j += i)
a[j] = !a[j];
for (int i = 1; i <= n; i++)
if (a[i])
cout << i << " ";
}
对比另一题
蒜头君今天回到了老家的大宅院,老家的灯还是那中拉线的灯(拉一次为亮,再拉一次就灭),蒜头君觉得无聊。把 10001000 盏灯 33 的倍数拉了一次,55的倍数拉了一次,7的倍数拉了一次(灯得的编号从 1-10001−1000,灯的初始状态都是亮的)。这个时候蒜头君在想还剩下几盏灯还在亮着?
提示:请不要输出多余的符号。
#include<stdio.h>
int main() {
int a[1001] = {0}, sum = 0;
for (int j = 3; j <= 1000; j += 3)
a[j] = !a[j];
for (int j = 5; j <= 1000; j += 5)
a[j] = !a[j];
for (int j = 7; j <= 1000; j += 7)
a[j] = !a[j];
for (int i = 1; i <= 1000; i++) {
if (a[i] == 0) //灯始终是亮着的
sum++;
}
printf("%d\n", sum);
}