样题简易的意思就是N盏灯,K个人去关。第K个人只会按下和K成倍数的开关,最后问那几盏灯开着。
题目不难,但是代码里一些技巧很好:
#include<stdio.h>
main()
{
int n,i,k,j,m,first=1;
int a[1008]={0};
scanf("%d%d",&m,&n);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(j%i==0)
a[j]=!a[j];
for(i=1;i<=m;i++)
{if(a[i]){
if(first)
first=0;
else
printf(" ");
printf("%d",i);
}
}
}
首先memset这个函数要在string.h头文件下
么么set(a, 0, sizeof(a))是把数组清0;
当然我个人觉得直接int a[1000]={0};更简单,可能有其他因素吧。
关键它设置了一个FIRST 的变量,遇到first为1(首先就赋值为1)就直接反赋值为0;然后再打印数字,下次遇到0的first的时候就在else里面打出空格;
这个技巧会经常用到,以前都是糊里糊涂的,要不然系统不判别后面是否多一个空格,要是判定,我经常就循环打到倒数第二个,然后再打出一个没有带空格的最后一个。
最后还有一个,这个数组它并没有设成BOOL 型,但是在判断开关的时候用的就是和bool一样的方法,没搞懂int型的数组也能用 =! ,可以取非??
思路就是这样。
原文地址:http://www.cnblogs.com/alexanderone/p/3854920.html