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,表示當前要輸出的變量是否爲第一個,第一個變量前不應有空格,但其它都有。