http://acm.hdu.edu.cn/showproblem.php?pid=2053
#include<stdio.h>
#include<string.h>
int a[100001];
int main(){
int n,i,j;
while(scanf("%d",&n) != EOF)
{
memset(a,0,sizeof(a));
for(i = 1;i <= n;i++){
for(j = i;j <= n;j+=i){
if(j%i == 0) a[j] = !a[j];
}
}
printf("%d\n",a[n]);
}
return 0;
}
《算法竞赛入门经典》第35页类似的开灯问题
题目: 有n盏灯,编号为1~n.第一个人把所有的灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关),第3个人按下所有编号为3 的倍数的开关(开着的灯关掉,关着的灯被打开),以此类推,一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯的编号。k<=n<=1000
样列输入: 7 3
样列输出: 1 5 6 7
#include <stdio.h>
#include <string.h>
#define MAXN 1000 + 10
int a[MAXN];
int main()
{
int i,j,n,k,first = 1;
memset(a,0,sizeof(a));
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];
}
for(i = 1; i <= n; i++)
if(a[i])
{
if(first)
{
first = 0;
}
else
{
printf(" ");
}
printf("%d",i);
}
printf("\n");
return 0;
}
设置标志变量first,表示当前要输出的变量是否为第一个,第一个变量前不应有空格,但其它都有。