开灯问题

开灯问题

n盏灯,第1个人全部打开,后面的人按下自己序号倍数的灯的开关(改变灯状态),一共k个人。输入n,k,输出开着的灯的编号。k<=n<=1000。

样例输入    7 3     样例输出   1 5 6 7

①我的程序

#include<iostream>
#define maxn 1010
int a[maxn];
using namespace std;
int main(void)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<maxn;i++)
a[i]=1;
for(int j=2;j<=k;j++)
for(int t=2;t<=n;t++)
{
if(t%j==0) a[t-1]++;
}
for(int m=0;m<n;m++)
{
if(a[m]%2!=0) printf("%d ",m+1);
else continue;
}
return 0;

}

 测试

 试试其他数据

②例题答案

#include<iostream>
#include<string.h>
#define maxn 1010
int a[maxn];
using namespace std;
int main(void)
{
int n,k,first=1;//标识变量first——表示当前要输出的变量是否为第一个。第一个变量前不应有空格,但其他变量有
memset(a,0,sizeof(a));//数组清零 ,在string.h中定义
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++)
if(j%i==0) a[j]=!a[j];//a[j]=!a[j]来改变状态
for(int i=1;i<=n;i++)
if(a[i]) {
if(first) first=0;
else printf(" ");
printf("%d",i);
}
printf(" ");
return 0;
}

值得学习改正的地方

首先,用标识变量first来控制输出格式,保证输出的第一个数据前没有空格,同时最后一个数据后直接回车 ,没有多余的空格,输出格式标准。

同时,改变状态用a[j]=!a[j],比自己的程序中改变一次状态即加一,最后根据对应序号是奇数还是偶数巧妙。

用string.h中的memset函数将数组清零:memset(a,0,sizeof(a));

原文地址:https://www.cnblogs.com/slay/p/9332485.html