欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《算法竞赛入门经典》(第2版)——开灯问题

程序员文章站 2024-03-19 08:42:52
...

看完题目后,自己先敲了一下,运行一下是可以的,代码如下

#include<stdio.h>
int a[1000]={0};
int main(){
	int n,k;
	scanf("%d %d",&n,&k);
	int j,i;
	for(i=1;i<=k;i++)
		for(j=1;j<=n;j++)
			if(j%i==0)
				a[j]=!a[j];
			else continue;
	for(i=1;i<=n;i++)
		if(a[i]==1)
			printf("%d ",i);
	return 0;
} 

然后,又对比了一下书上写的(代码如下),感觉自己写的有些啰嗦。。。
自己的反思写在下面的注释里了

#include<stdio.h>
#include<string.h>
#define maxn 1010
int a[maxn];
int main(){
	int n,k,first=1,i,j;
	memset(a,0,sizeof(a));//加上头文件#include<string.h>后,作用是把数组清零
	scanf("%d %d",&n,&k);
	for(i=1;i<=k;i++)
		for(j=1;j<=n;j++)
			if(j%i==0)
				a[j]=!a[j];//!0=1,!1=0,巧妙的模拟了开关的闭合
	for(i=1;i<=n;i++)
	//下面这一段可以当作模板记下来,输出时,能够实现空格的不少不多
		if(a[i]){
			if(first)
				first=0;
			else 
				printf(" ");
			printf("%d",i);
		}
	printf("\n");
	return 0;
}

多多积累经验,共勉!

相关标签: ACM